
О проекте
Мой первый большой PHP-проект: движок, который по расписанию собирает данные из разных источников и собирает из них «живую» обложку сообщества ВКонтакте. Сервис обслуживал сразу несколько групп (в т.ч. миллионников) и работал без участия редакторов: сам подтягивал свежие цифры, рендерил изображение и заменял обложку в группе через VK API.
Что умеет (модули данных)
- VK-метрики: число подписчиков, текущее описание/статус, последние посты/комментарии, топ активных участников (лайки/комменты/репосты за период), счётчики по группам одной сети.
- Погода (OpenWeather): температура, иконки/погодные описания, ветер/давление; дневной/ночной набор иконок.
- Курсы и котировки: официальный курс ЦБ РФ (доллар/евро и др.), цена Brent.
- Трафик города (Яндекс): баллы пробок/текстовое описание.
- YouTube: инфо по каналу, последнее видео и его статистика.
- Telegram: количество подписчиков канала.
- Время/таймеры/дата: счётчики/обратные отсчёты (ивенты, дедлайны).
Каждый модуль имеет свой TTL и файловый кэш — сеть дергается только когда это реально нужно.
Архитектура
- Worker (ядро): абстрактный класс, который собирает данные из модулей, подставляет в шаблон и отдаёт на рендер. Для каждой обложки создаётся свой мини-класс
MyWorker
с бизнес-логикой: какие блоки показать, в каком формате, как ранжировать топ. - VKAPI: тонкая обёртка над методами
photos.getOwnerCoverPhotoUploadServer
→photos.saveOwnerCoverPhoto
(в т.ч. кроп под мобильные/десктопные координаты), базовые ретраи и логирование. - View/Template: HTML-слой
layer.tpl
с плейсхолдерами (%leftText%
,%rightText%
,%fonts%
,%locdir%
) и кастомными шрифтами через@font-face
. Шаблон собирается и рендерится в итоговое изображение (JPEG/PNG). - Image (GD): низкоуровневые операции: отрисовка текста (многострочность, кернинг, тень/обводка, выравнивание по осям), работа с картинками (маски/круг, кроп, подгон по сторонам, подмена отсутствующих аватаров), кэш удалённых изображений.
- Многогрупповость: один инстанс движка обслуживает много групп (общая статистика сети и индивидуальные обложки).
- Cache: файловый кэш с учётом TTL на каждый источник.
- Конфиг и панель: централизованные пути/токены, директории для временных файлов/кэша, и интеграция с маленькой панелью управления.
- Ошибки/алерты: сбор ошибок в буфер + отправка в Telegram; если не доступен — fallback в личку VK админам (без утечек трейсбеков в публичный ответ).
Исполнение и производительность
- Cron-задачи: регулярный запуск обновлений; батч-режим с
curl_multi
— несколько обложек рендерятся параллельно, чтобы не упираться в сетевые задержки. - Окружение: PHP с
gd
(freetype/jpeg/webp), доступ к MySQL и внешним API; файловый кэш для снижения нагрузки. - Оптимизации: разнесённые TTL, локальный кэш сторонних картинок, минимизация внешних запросов; в шаблонах — только то, что влияет на узнаваемость и конверсию.
Рендер и шаблоны
- Двухслойная модель: «фон» (обложка проекта) + «фронт»/«бэк» слои с текстом/иконками — можно быстро переключать композиции без перепаковки кода.
- Типографика: подключение кастомных шрифтов в шаблоне, подстройка межбуквенных/межстрочных интервалов на уровне движка, безопасная обрезка длинных строк.
- Медиа и аватарки: маски (круг/скругление), дефолтные заглушки, подмена размеров
w/h/size
с сохранением пропорций.
Защита от лимитов и «тонкие места»
- Rate-limit дружелюбность: всё, что можно, берётся из кэша; тяжёлые операции (топы/YouTube/погода) — с увеличенным TTL и деградацией «по-умному» (резервные значения/фэйковые пользователи для top-блоков).
- Исключения: списки исключённых ID (не попадут в топ/ранжирование) и маскировка пустых данных, чтобы не «ломать» сетку шаблона.
- Временные зоны и расписание: генерация в
Europe/Moscow
, учёт ночного оформления (альтернативный фон/иконки).
Роль и зона ответственности
С нуля спроектировал и написал ядро, модули под все источники данных, шаблонизатор/отрисовку, VK-интеграцию и крон-планировщик; настроил окружение и мониторинг ошибок. В бою сервис обслуживал несколько крупных пабликов, стабильно обновлял обложки и переживал сетевые сбои без «битых» картинок.
Итог
Готовая «машинка» для живых обложек: понятная архитектура, быстрый рендер, безопасная интеграция с VK и богатый набор виджетов — от топа участников до погоды и YouTube. Работала «на потоке» и не требовала ручной поддержки.