Это явно не заслуживает отдельной статьи на Хабре, но ошибка может коснуться большого количества людей, поэтому я всё-таки решил написать.
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
Автор: selivanov_pavel