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]

Share

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..), и вставлять в документ уже из локального каталога.

Share

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

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

(далее…)

Share

Проверка URL на валидность (preg_match) в PHP

Нужен был рег для проверки корректности введенного URL. Для примера был взят один отсюда, но немного дописан.
Добавлена возможность принимать урлы с указанием порта, а также разрешено использование в адресе (не домене) символов «()*» (причем это позволено RFC 1738) и кириллицы (да, появилась нужда принимать и обрабатывать такие адреса без предварительного rawurlencode()).

(далее…)

Share

Excel-файл из PHP

Появилась задача создания простых таблиц excel налету.
В принципе, если поискть в сети, то можно найти ряд готовых инструментов для создания *.xls файлов.
Делюсь с вами коротким обзором.

(далее…)

Share