Картинка-счетчик на PHP

Есть у меня одна абсолютно бесполезная, но забавная фигулька для LiveInternet.ru: счетчик возраста дневника. Некоторые начали спрашивать, как он устроен. Спрашивали - отвечаем. Сегодня я расскажу вам, как сделать подобный счетчик самостоятельно. Приступим?

Хотя перед тем, как начать, уточню: у вас должен быть в распоряжении хостинг и поддержка на нем PHP с включенным модулем GD. Уже страшо? То ли еще будет. Поехали.

Для начала выберем, что будет отсчитывать счетчик. Я за пример взял одно давнее свое ожидание, выход «StarCraft 2». Blizzard обещает выпустить его двадцать седьмого числа, вот до этого дня и будем считать секунды.

Исходя из темы выбираем фоновую картинку:


Неплохо бы еще найти шрифт под стать. Все, приготовления закончились, переходим к написанию скрипта.

<?php
// Получаем текущие дату-время
$currdate=getdate();

// Грузим картинку в память
$image=@ImageCreateFromJPEG("sc2.jpg");

// Получаем текущее время в секундах, начиная от 1 января 1970г.
$currdate=$currdate[0];

// Дата выхода SC2 - 27.07.2010
$dh=0; $dm=0; $ds=0; $dmt=7; $dd=27; $dy=2010;
$datedate=mktime($dh,$dm,$ds,$dmt,$dd,$dy);

// Сколько осталось секунд?
$lost=($datedate-$currdate);

// А может, и не осталось ничего уже?
if ($lost<=0) {
$s_write="NUCLEAR\nLAUNCH\nDETECTED";
} else {
// Осталось дней
$lost_d=($lost-$lost%86400)/86400;
$lost=$lost-$lost_d*86400;

// Осталось часов
$lost_h=($lost-$lost%3600)/3600;
$lost=$lost-$lost_h*3600;

// Осталось минут
$lost_m=($lost-$lost%60)/60;
$lost=$lost-$lost_m*60;

// Осталось секунд
$lost_s=$lost%60;

$s_write="REMAIN: \n\n0".$lost_d." DAYS\n".$lost_h." HOURS\n".
$lost_m." MINUTES\n".$lost_s." SECONDS";
}

// Рисуем на картинке текст, подгружая скаченный шрифт
imagettftext($image, 14, 0, 301, 64, 16777215, "starcraft.ttf", "$s_write");

// Отсылаем заголовок: "Это картинка!"
header ("Content-type: image/jpeg");
// Отсылаем заголовок: "Срок годности - минута!"
header ("Expires: ".date("r",($currdate+60)));
// Выгружаем саму картинку...
ImageJPEG($image,null,100);
ImageDestroy($image);
Exit;
?>


В результате получится что-то вроде этого:



Дальше для верности делается всякое кеширование (чтобы не загружать скрипт генерированием картинки каждое обращение) и тому подобные народные забавы, но это я оставлю вам на самостоятельную проработку.
Солодовник Константин (19 июл 2010г, 09:33) #
Отличная штука, спасибо!
V.exeR (19 июл 2010г, 09:46) #
u739 Солодовник Константин: тоже ждешь новый StarCraft? :D
Солодовник Константин (19 июл 2010г, 09:50) #
u71 V.exeR, жду конечно, но мне больше сама идея понравилась. Это же можно любую картинку так сделать :)
V.exeR (19 июл 2010г, 10:04) #
u739 Солодовник Константин: да я шучу. Да, можно. У меня целы сервис с информерами был (можно было отсчитывать как время до, так и после какой-либо даты), но как-то не прижилось.

А еще можно случайную фразу выдавать. Или... Да в общем, была бы фантазия :D
i-atemi (19 июл 2010г, 11:40) #
Спасибо, забью в закладки, может пригодится :) .

Если не лень, можно разработки ради поставить сервер с PHP :) . Загрузка и проверка работы происходит гораздо быстрее))).
V.exeR (19 июл 2010г, 12:04) #
u943 i-atemi: я именно так и тестирую. На «Денвере» :)
zeleboba (20 июл 2010г, 14:36) #
Извиняюсь, что запутал тебя в жуйке :)
А за мануал спасибо. Просто и доступно. Затащил к себе в закладки, ибо пригодится, думаю, скоро :)
V.exeR (20 июл 2010г, 16:25) #
u714 zeleboba: да ничего. Кстати, утром упорно искал твой комментарий и свой ответ тут, в блоге. Не найдя, чуть было не решил, что приснилось :D
Зиниченко Ольга (26 июл 2010г, 15:20) #
«...у вас должен быть в распоряжении хостиг...»
V.exeR (26 июл 2010г, 16:02) #
u797 Зиниченко Ольга: это тебя смущает? Это не так страшно, как звучит ;)
exs (26 июл 2010г, 16:22) #
u714 zeleboba, Если ты планируешь такой скрипт на дроидньюс использовать, то сначала со мной побеседуй :D
u797 Зиниченко Ольга, можно и без хостинга, но тогда нужен круглосуточно включённый домашний компьютер с апачем и пхп + если нет выделенного ИП, то воспользоваться сервисом вроде no-ip.com
Кстати @ в коде зло :)
V.exeR (26 июл 2010г, 19:07) #
u1012 exs:
Кстати @ в коде зло :)

Пофиг, все равно картинку генерю и ошибки отключены :D
QoSyS (27 июл 2010г, 08:39) #
Зло проявляет себя если не использовать кэширование :)
Не обязательно же только счетчик может быть на картинке, чаще всего какая-нибудь другая информация, которую пропарсили, например, из профиля. Тут определенно нужна задержка )
V.exeR (27 июл 2010г, 08:41) #
u1000 QoSyS: думаешь, стоит объяснить кеширование?..
QoSyS (27 июл 2010г, 09:03) #
Да, немного но стоит. Да и самый простой вариант кэширования - по определенному таймауту обновлять картинку - не так уж сложен ) Можно даже без крона обойтись...