Fail при обновлении PHP 5.4

31st Март 2014 | Категории: Сервер | Метки: , ,

Давно не писал я про свои фейлы. Непорядок. Исправим.
Вздумалось мне давеча обновить версию 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";

Subscribe without commenting


  1. 6th Сентябрь 2015 в 22:33

    Спасибо за подробное описание. Надеюсь еще будут статьи на тему Yii и PHP