Pull to refresh

Изменение в PHP 7, ломающее при обновлении с пятой версии некоторые сервера на Ubuntu

*nix *Server Administration *
Sandbox

Это явно не заслуживает отдельной статьи на Хабре, но ошибка может коснуться большого количества людей, поэтому я всё-таки решил написать.


http://php.net/manual/en/configuration.file.php#configuration.file.changelog :


7.0.0 Hash marks (#) are no longer recognized as comments.

Казалось бы, что такого? Админы на тестовом сервере обнаружат появившиеся ошибки в конфигах и быстро поправят. Но тут вступает в дело одна неприятная особенность php-fpm: он отказывается запускаться с некорректным файлом php-fpm.conf, но спокойно запустится с некорректным php.ini, проигнорировав все его настройки и используя значения по умолчанию. Ошибка не будет видна в консоли, так как её проглотит скрипт запуска службы, и не будет записана в лог php-fpm.



Если php.ini был скопирован из пятой версии, а более строгий парсер седьмой читает его с ошибками — php-fpm будет молча работать со значениями по-умолчанию. Например, если там использовались # для комментариев и такой комментарий содержит открывающую скобку. Без открывающей скобки он такие комментарии по-прежнему воспринимает нормально, несмотря на объявление в changelog.


Максимальный объём загружаемого файла post_max_size=8m, включен expose_php, передающий в заголовке X-Powered-By используемую версию PHP, станет пустой disable_functions, используемая для отключения потенциально небезопасных функций, display_errors станет 1 и посетители увидят полный стектрейс на страницах с ошибками, и ещё много всего весёлого.


Мейнтейнеры PHP в Ubuntu пытаются обходить эту особенность с помощью костыля:


/etc/systemd/system/multi-user.target.wants/php7.0-fpm.service:

...
ExecStartPre=/usr/lib/php/php7.0-fpm-checkconf
...

/usr/lib/php/php7.0-fpm-checkconf:

...
errors=$(/usr/sbin/php-fpm7.0 --fpm-config "$CONFFILE" -t 2>&1 | grep "\[ERROR\]" || true);
...

Но костыль не работает:


root@xenial:~# /usr/sbin/php-fpm7.0 --fpm-config  /etc/php/7.0/fpm/php-fpm.conf --test
PHP:  syntax error, unexpected '(' in /etc/php/7.0/fpm/php.ini on line 6
[14-Sep-2016 14:24:46] NOTICE: configuration file /etc/php/7.0/fpm/php-fpm.conf test is successful

root@xenial:~# /usr/lib/php/php7.0-fpm-checkconf; echo $?
0

Пакет php7.0-fpm из популярного ppa:ondrej/php, откуда обычно ставят PHP 7 на сервера с ubuntu trusty или precise, вообще не содержит такой проверки.


Итого: если вы обновляетесь c PHP 5 на PHP 7, убедитесь, что он не проигнорировал настройки в php.ini и не завёлся со значениями по-умолчанию.


P.S.
» Тикет для ppa:ondrej/php
» Тикет для php7.0-fpm в ubuntu xenial


UPD: По просьбе в комментариях запостил баг разработчикам PHP: 73099

Tags:
Hubs:
Total votes 45: ↑40 and ↓5 +35
Views 14K
Comments Comments 27