Fail при обновлении PHP 5.4
Давно не писал я про свои фейлы. Непорядок. Исправим.
Вздумалось мне давеча обновить версию PHP на сервере до 5.4. Но как всегда… Не всё так просто.
Проверяем версию, пробуем обновить стандартными средствами Centos:
php -v # PHP 5.3.19 (cli) yum update php # No Packages marked for Update |
Гугл быстро выдал пару советов, как получить PHP 5.4 на Centos 6.
Больше всего мне понравилось вот это решение: PHP 5.4 on CentOS via Yum/
rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm yum install php54w yum install yum-plugin-replace yum replace php-common --replace-with=php54w-common yum install php54w-pecl-apc |
Соглашаемся на всё. И получаем обновленный PHP:
php -v # PHP 5.4.25 (cli) (built: Feb 7 2014 12:14:54) |
Перезапускаем apache и nginx:
service httpd restart service nginx restart |
При попытке зайди на любой сайт, прописанный на этом сервере, видим стандартную заглушку Apache. Причем статика отдаётся правильно, а вот php-скрипты показывают свое содержимое, как простые текстовые файлы.
Больше часа я пытался шаманить с конфигами Apache / PHP, но все безрезультатно. Решился на переустановку всего окружения. Решился и задумался: а нужна ли мне связка Apache + Nginx на сервере? Уже давно чесались руки заменить все на PHP-FPM + Nginx. Терять было нечего.
Для начала я решил всё удалить и установить с нуля.
Apache удаляется легко:
yum remove httpd |
А вот при попытке удалить Nginx я получил следующее:
yum remove nginx # Package(s) nginx available, but not installed. # No Packages marked for removal |
И тут я вспомнил, что около года назад дважды устанавливал Nginx из исходников. Первый раз – когда меня DDoS‘или, и мне потребовалось добавить модуль GeoIP. Второй раз – когда я пытался подружить Ruby On Rails и PHP на одном сервере при установке Redmine.
В итоге пришлось удалять всё «по-варварски»:
service nginx stop rm -rf /opt/nginx |
Система очищена. Приступаем к установке. Мне понравилась эта инструкция: Install and configure Nginx, MySQL & PHP-FPM in CentOS 6. Так как у меня уже был настроенный MySQL, я сразу приступил к 4 пункту.
Устанавливаем Nginx + PHP-FPM:
yum --enablerepo=remi,remi-test install nginx yum install php54w-fpm |
Настраиваем автозагрузку:
chkconfig httpd off chkconfig --add nginx chkconfig --levels 235 nginx on chkconfig --add php-fpm chkconfig --levels 235 php-fpm on |
Для оптимальной настройки Nginx необходимо установить значение worker_processes
равным числу процессоров (ядер). Это можно сделать командой (помня, что счёт идет с нуля):
cat /proc/cpuinfo | grep processor |
Настраиваем конфиги Nginx и PHP-FPM точь-в-точь как в инструкции.
Запускаем.
service nginx start service php-fpm start |
Радуемся, что всё работает.
Осталось проверить работоспособность сайтов в новом окружении.
В проекте на Code Igniter отвалился роутинг и в логи посыпались предупреждения:
"NOTICE: PHP message: PHP Parse error: syntax error, unexpected 'endforeach' (T_ENDFOREACH)"
Что бы исправить NOTICE необходимо в php.ini
прописать:
short_open_tag = On
Роутинг легко починился установкой правильного значения в config.php
:
$config['uri_protocol'] = "REQUEST_URI";
Спасибо за подробное описание. Надеюсь еще будут статьи на тему Yii и PHP