PHP библиотека для создания Турбо Страниц Яндекса

Не так давно в Яндексе объявили о собственной разработке быстрых страниц, по типу AMP от Google или Instant Articles от Facebook, правда пока с очень ограниченным функционалом (но стоит отметить, что функционал постоянно дорабатывается).
Решил попробовать запустить Турбо Страницы на одном из своих проектов. Но как оказалось, технология есть, а никаких SDK и библиотек для PHP нет.

Пришлось набросать свою библиотеку.

Сейчас она поддерживает весь основной функционал для создания фида с турбо-страницами, а так же содержит хелпер для создания элементов контента в формате, поддерживаемым турбо-страницами.

Изначально писал всё под PHP 7, уж больно мне нравится строгая типизация, а так же свежий phpunit. Но потом попросили сделать версию с поддержкой PHP 5.4. И чтобы не отказываться от современных инструментов, и не ломать версию для 7 PHP, решил сделать отдельную версию с поддержкой PHP 5.4.

Обе версии лежат на гитхабе.
Версия для PHP 7 (и выше): https://github.com/sokolnikov911/yandex-turbo-pages
Версия для PHP 5.4 (и выше): https://github.com/sokolnikov911/yandex-turbo-pages-php5

Fatal error: Call-time pass-by-reference has been removed

Каждое новое обновление серверного программного обеспечения — это упражнение из области «и хочется, и колется…». Так и я решил наконец-таки устаревающий PHP5.2 оставить в прошлом (ведь он не умеет работать с многими новомодными плюшками), и перейти на PHP5.4.

Таким образом был обновлен PHP на одном из боевых серверов (с полутора дясятком разного рода сайтов). Реакция клиентов не заставила себя долго ждать, и сразу посыпались жалобы на поломанный в разных местах функционал.

Расскажу об одной из причин, вдруг кому-то пригодится.

Выполнение некоторых участков кода заваливалось с ошибкой «Fatal error: Call-time pass-by-reference has been removed in».

Оказалось, что новый PHP не разрешает использовать ссылку (&$arg) в вызове функции. К слову, PHP и раньше мог ругаться на такую конструкцию, правда всего-лишь на уровне Warning’ов. Новый PHP оказался строже, отдавая Fatal error при выполнении.

В это же время использование ссылки на аргумент в объявлении функции допускается и приветствуется.

Резюмирую.

Стоит избегать конструкций:
[code type=php]myFunc($arg1, &$arg2);[/code]

А использовать:
[code type=php]function myFunc($arg1, &$arg2) {}[/code]

fpdf (ufpdf) «fatal error: allowed memory size of…»

В текущем проекте появилась необходимость делать экспорт некоторых документов в PDF. Один из лучших классов, существующих на сегодняшний день — fpdf. А если вам понадобится работать с кирилицей (utf-8), тогда вам понадобится ufpdf.
В один прекрасный момент работы с этим классом, я столкнулся с тем, что периодически и безсистемно при генерировании pdf-документа fpdf падает с ошибкой «fatal error: allowed memory size of…».
Погуглив нашел упоминания в сети о похожей проблеме, связанной с использованием колонтитулов в документе. Но в моих документах они не используются, и поэтому пришлось искать дальше. Ничего не нагуглив, начал искать ошибку методом исключения.
Ошибка оказалась в следующем. fpdf почему-то не очень любит вставлять изображения из сети, например:

$pdf->Image('http://yandex.st/morda-logo/i/l-logo-ua.png',10,80,'160','','PNG','');

Проблема решается просто. Изображение перед вставкой в документ надо сохранить на сервер любым способом (fopen(), file_get_contents(), etc..), и вставлять в документ уже из локального каталога.

MySQL Incorrect integer value

Давно не обновлял на локальном сервере программное обеспечение, и тут после обновления mysql-сервера до версии 5.5 столкнулся с тем, что многое из написанного ранее вываливается с ошибкой mysql типа «1366 — Incorrect integer value». Всё из-за того, что в поля с автоинкрементными значениями я вставлял по старинке, оставляя значение этого поля пустым. Сейчас же требуется использовать значение NULL. Новый сервер mysql по-умолчанию работает со включенным strict-mode, и не позволяет использовать такие инсерты. Поэтому вариантов решения два:
1. переписать код и вставлять в автоинкрементные поля значения грамотно, используя NULL;
2. выключить strict-mode, закоментировав в my.ini (my.cnf) строку «sql-mode=»STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION»«.

Если меняете настройки mysqld, не забудьте потом перезагрузить сервис.

Рождественская история, современный взгляд.

Много раз на протяжении праздников наталкивался на этот ролик, но посмотрел только сегодня. Отличная идея, создатели этого видео — молодцы. Рождественская история через призму современности. Пример того, как можно постараться передать Евангелие нынешней молодежи, не исказив при этом сути. 2000 лет назад Спаситель пришел в мир так же тихо, без царских почестей, об этом знал только определенный круг людей.

Он, по природе Бог, не держался за равенство с Богом, но добровольно лишился всего, приняв природу раба и человеком родившись. Он был во всем человеку подобен, но еще больше себя умалил и так был послушен, что принял и смерть саму — смерть на кресте. За это Бог вознес Его над всеми и Имя даровал превыше всех имен, чтобы пред именем Иисуса всякое колено преклонилось — на небе, на земле и в преисподней — и всяк язык провозгласил, что Иисус Христос — Господь, во славу Бога Отца.
Библия, современный перевод. Послание Филиппийцам 2:6-11.

Автоматический выбор необходимой пользователю языковой версии сайта на PHP

Сегодня появилась задача сделать для сайта, на котором используется интерфейс на двух языках, сделать автоматическое определение системного языка у пользователя. Чтобы пользователю сходу отдавать интерфейс на нужном ему языке.
В связи с этим набросал туториал с примером этого функционала.

(далее…)

Автоматическое создание субдоменов в Apache2

Мне приходится работать с движками многих сайтов, постоянно появляются для обслуживания новые, и уходят в архивное забвение старые. Поэтому часто добавляются новые блоки виртуалхостов в конфиге Апача, и сам конфиг уже изрядно раздулся.
Появилась минутка свободного времени, и я решил навести порядок в этом безобразии. Захотелось сделать так, чтобы для добавления нового сайта, было достаточно создать директорию, и прописать новый хост в /etc/hosts, а не повторять каждый раз монотонную операцию добавления и редактирования блоков <VirtualHost>.
По сути теперь у меня есть основной домен, и к нему автоматически добавляются субдомены, по которым и грузятся разные сайты с локальной машины.

(далее…)

Есть нужда

У моего хорошего старого друга Алексея — беда. У его жены обнаружили рак. Всем кто захочет и сможет помочь финансово или молитвенно всю информацию и историю их борьбы с болезнью можете получить тут: http://anexus.livejournal.com/. За достоверность информации ручаюсь лично.