Рассмотрим обновление на PHP 7-ой версии в системе CentOS 7 работающей с Nginx. Произведем настройку после обновления всех необходимых конфигурационных файлов для работы ресурсов использующих php. Процесс сложный требующий внимания и ответственности.

Введение

Рано или поздно приходит время обновить старую версию PHP на новую. Как правило это обусловлено требование при обновлении ресурсов которые не смогут работать со старой версией. Редко обновление приходит без ручного вмешательства в редактирование конфигурационных файлов.

Обязательно перед обновление сделайте резервную копию системы и после обновления максимально проверьте все ресурсы использующие PHP!

В моем случае я обновляю версию которую устанавливал в статье Установка и настройка PHP.

Удаление старой версии PHP

Перед тем как установить новую версию нам надо определить какая стоит версия, какие пакеты и с какого репазитория.

Подготовка перед удалением

Проверим установленную версию:

php -v
= вывод команды =
PHP 5.6.30 (cli) (built: Jan 26 2017 00:22:46) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

Выведем весь список установленных пакетов:

rpm -qa | grep php
= вывод команды =
php-pecl-jsonc-1.3.10-2.el7.remi.5.6.x86_64
php-pdo-5.6.31-1.el7.remi.x86_64
php-pecl-memcache-3.0.8-4.el7.remi.5.6.x86_64
php-soap-5.6.31-1.el7.remi.x86_64
php-mbstring-5.6.31-1.el7.remi.x86_64
php-common-5.6.31-1.el7.remi.x86_64
php-xml-5.6.31-1.el7.remi.x86_64
php-cli-5.6.31-1.el7.remi.x86_64
php-pear-1.10.5-2.el7.remi.noarch
php-gd-5.6.31-1.el7.remi.x86_64
php-mysqlnd-5.6.31-1.el7.remi.x86_64
php-xmlrpc-5.6.31-1.el7.remi.x86_64
php-imap-5.6.31-1.el7.remi.x86_64
php-fpm-5.6.31-1.el7.remi.x86_64
php-snmp-5.6.31-1.el7.remi.x86_64
php-pecl-zip-1.15.1-1.el7.remi.5.6.x86_64
php-process-5.6.31-1.el7.remi.x86_64
php-odbc-5.6.31-1.el7.remi.x86_64
php-ldap-5.6.31-1.el7.remi.x86_64
php-opcache-5.6.31-1.el7.remi.x86_64

Исходя из вывода удалим все эти пакеты. Новую версию php мы будем устанавливать с другого репазитория. Репозиторий remi нам больше не нужен и мы его удалим.

Удаление PHP 5.6

Удалим одной командой:

yum remove php-pecl-jsonc php-pdo php-pecl-memcache php-soap php-mbstring php-common php-xml php-cli php-pear php-gd php-mysqlnd php-xmlrpc php-imap php-fpm php-snmp php-pecl php-process php-odbc php-ldap php-opcache

Внимательно смотрим лог обновления на предмет ошибок и предупреждений! Сохраните все ошибки и предупреждения. Уверяю в последствии это сильно сократит время в настройке после обновления!

Удаление репозитория Remi-safe

Не вижу смысла держать репозитории которые больше не используются и всегда их удаляю.

Выведем список всех используемых репозиториев:

yum repolist
= вывод части команды =
Загружены модули: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.yandex.ru
 * epel: mirror.yandex.ru
 * extras: mirror.yandex.ru
 * remi-safe: mirror.awanti.com
 * updates: mirror.yandex.ru
Идентификатор репозитория репозиторий состояние
!remi-safe Safe Remi's RPM repository for Enterprise Linux 7 - x86_64 2 509

В выводе видим точное имя которое мы используем при удалении:

yum-config-manager --disable remi-safe
В случае ошибки установите пакет yum-utils!
yum -y install yum-utils

После всех действий обновим систему чтобы окончательно всё подготовить к установке новой версии:

yum update

Установка новой версии PHP

Выбор репозитория и версии PHP 7

Вероятно есть разные варианты установки PHP 7 версии, но мне нравится репозиторий WebtaticEL про него и расскажу.

Всегда старайтесь смотреть документацию разработчиков при работе с любыми программами и пакетами. Копировать бездумно команды с множества статей в интернете плохая привычка. Помимо того что вы можете все испортить непониманием вводимых команды вы может напрочь убить настраиваемую систему. В своих статьях я стараюсь указывать источник и перед опубликованием всегда проверяю написанное на своих рабочих или тестовых системах.
PHP от WebtaticEL

Перейдя по ссылке что я указал выше вы увидите все варианты версий возможных для установки а так же способы их установки в необходимую вам систему. Мой выбор пал на версию PHP 7.1 так как на данный момент это самая стабильная новая версия.

Добавление репозитория Webtatic

Добавим репозиторий в систему:

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

После добавление любого репазитория необходимо обновить список пакетов и и в CentOS это можно сделать командой вывода всех репозиториев которая заодно и обновит весь список пакетов:

yum repolist

Установка PHP 7.1

Установим все нужные мне пакеты исходя из тех что удалял:

yum install php71w-fpm php71w-pdo php71w-soap php71w-mbstring php71w-common php71w-xml php71w-cli php71w-pear php71w-gd php71w-mysqlnd php71w-xmlrpc php71w-imap php71w-fpm php71w-snmp php71w-process php71w-odbc php71w-ldap php71w-opcache

Сознательно не стал ставить параметр с которым всё установится без вопросов. Лучше всегда быть на контроле таких сложных и ответственных обновлений.

Можем уставим все что есть, но решать вам самим что для вас лучше:

yum install php70w-cli php70w-common php70w-bcmath php70w-dba php70w-devel php70w-embedded php70w-fpm php70w-gd php70w-imap php70w-interbase php70w-intl php70w-ldap php70w-mbstring php70w-mcrypt php70w-mysql php70w-odbc php70w-opcache php70w-pdo php70w-pdo_dblib php70w-pear php70w-process php70w-pspell php70w-recode php70w-tidy php70w-xml php70w-xmlrpc

После обновления я предпочитая перезагрузить систему чтобы окончательно избавится от сомнений что что то работает по старой схеме и после перезагрузки перестанет работать.

Проверка после обновления PHP

После обновления первым делом проверим какая версия php в системе:

php -v
= вывод команды =
PHP 7.1.8 (cli) (built: Aug 9 2017 19:19:49) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
 with Zend OPcache v7.1.8, Copyright (c) 1999-2017, by Zend Technologies

Видим что установилась новая версия, но почти со 100% уверенностью могу сказать что при попытке открыть свой интернет ресурс вы обнаружите что он не работает. Вот тут то и пригодятся все наши сохранённые предупреждения при удалении, обновлении и установке новых пакетов.

Ошибки в логах установки/удаления

В моем случае было несколько предупреждений:

  • warning: /etc/nsswitch.conf created as /etc/nsswitch.conf.rpmnew;
  • предупреждение: /etc/php-fpm.d/www.conf сохранен как /etc/php-fpm.d/www.conf.rpmsave;
  • предупреждение: /etc/php.ini сохранен как /etc/php.ini.rpmsave.

Как видите система сказала что в двух случаях она создала новые файлы а старые сохранила с пометкой rpmsave. В случае когда система не смогла создать новый файл она создала его с пометкой rpmnew.

Любыми удобными вам способами сохраните копии созданных новых рабочих файлов. Необходимый вам код из старых сохраненных обновлением файлов перенесите в новые рабочие файлы. Мне было необходимо отредактировать два файла /etc/php-fpm.d/www.conf и /etc/php.ini.

На моих системах, с которыми я работаю, мне не доставляет это большого труда, так как весь код что я правлю документируется. Всегда комментирую старый код и пишу новый с пометками. При таком подходе мне проще понять код и тому кто будет работать с системой после меня будет проще разобраться при возникновении проблем.

Настройка PHP-FPM после обновления

Так как у нас работает Nginx и для связки с php используется php-fpm мы проверим необходимую службу:

systemctl status php-fpm.service
● php-fpm.service - The PHP FastCGI Process Manager
 Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; disabled; vendor preset: disabled)
 Active: inactive (dead)

Из вывода мы видим что служба остановлена и отсутствует в автозагрузке. Добавим в автозагрузку, запустим и посмотрим статус:

systemctl enable php-fpm.service
= вывод команды =
Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.

systemctl start php-fpm.service
= вывод команды говорящей об ошибке запуска= 
Job for php-fpm.service failed because the control process exited with error code. See "systemctl status php-fpm.service" and "journalctl -xe" for details.

systemctl status php-fpm.service
= вывод части команды =
● php-fpm.service - The PHP FastCGI Process Manager
 Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
 Active: failed (Result: exit-code) since Пт 2017-09-15 22:00:06 MSK; 13s ago
 Process: 11678 ExecStart=/usr/sbin/php-fpm --nodaemonize --fpm-config /etc/php-fpm.conf (code=exited, status=78)
 Main PID: 11678 (code=exited, status=78)

[15-Sep-2017 22:00:06] ERROR: [/etc/php-fpm.d/www.conf:2] value is NULL for a ZEND_INI_PARSER_ENTRY
сен 15 22:00:06 lemp.sevo44.loc php-fpm[11678]: [15-Sep-2017 22:00:06] ERROR: Unable to include /etc/php-fpm.d/www.conf from /etc/php-fpm.conf at line 2
сен 15 22:00:06 lemp.sevo44.loc php-fpm[11678]: [15-Sep-2017 22:00:06] ERROR: failed to load configuration file '/etc/php-fpm.conf'

Из вывода команды мы видим ошибку во второй строке файла /etc/php-fpm.d/www.conf. Откроем и посмотрим код:

cat /etc/php-fpm.d/www.conf
= вывод команды =
[www]
#Используем порт 9000 по адресу 127.0.0.1
listen = 127.0.0.1:9000;
listen.allowed_clients = 127.0.0.1
#Пользователь и группа от которой работает php

Видим что вторая строке и отключена знаком #. Посмотрев в сохранном созданном установщиком новом файле увидим что все отключения идут знаком ;. Заменив все знаки # на ; сохраним и перезапустим службу и посмотрим статус:

systemctl restart php-fpm.service
= вывод пустой если нет ошибок =

systemctl status php-fpm.service
= вывод команды =
● php-fpm.service - The PHP FastCGI Process Manager
 Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
 Active: active (running) since Пт 2017-09-15 22:02:48 MSK; 4s ago
 Main PID: 11749 (php-fpm)
 Status: "Ready to handle connections"
 CGroup: /system.slice/php-fpm.service
 ├─11749 php-fpm: master process (/etc/php-fpm.conf)
 ├─11750 php-fpm: pool www

сен 15 22:02:48 lemp.sevo44.loc systemd[1]: Starting The PHP FastCGI Process Manager...
сен 15 22:02:48 lemp.sevo44.loc systemd[1]: Started The PHP FastCGI Process Manager.

Видим что служба находится в автозагрузке и работает.

Вывод всех параметров PHP 7

Последнее что нам осталось сделать для полного понимания проделанной работы это посмотреть вывод всей информации о версии php. Создадим на работающем ресурсе в корневой директории сайта файл info.php и поместим туда код:

<?php phpinfo(); ?>

Достаточно набрать в строке браузера http://IP или ИМЯ/info/php и вы увидите страницу примерно с таким содержанием:

PHP Version 7.1.8

System Linux lemp.sevo44.loc 3.10.0-693.2.2.el7.x86_64 #1 SMP Tue Sep 12 22:26:13 UTC 2017 x86_64
Build Date Aug 9 2017 19:21:59
Server API FPM/FastCGI
Virtual Directory Support disabled
Configuration File (php.ini) Path /etc
Loaded Configuration File /etc/php.ini
Scan this dir for additional .ini files /etc/php.d

и тд. и тп.

Вывод

Судя по статье может показаться что обновление версии PHP не такое уж и сложное дело но уверяю что эта простота придет только с опытом. Многое зависит от того как долго не обновляли систему, какие ресурсы там работают и какие у каждого в отдельности требования к версии php. В случае если вам досталась система с которой работали разные люди и мало чего комментировали в коде сложностей может возникнуть очень много и единственное что вас спасет от головной боли в случае неправильной работы важных ресурсов это резервное копирование перед выполнением обновления. Лучшим вариантом при обновлении таких систем это сделать клон системы и производить все действия на нем. Конечно при работе с клоном может возникнуть дополнительные сложности но это уже другая тема.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Хотите сказать денежное спасибо? Подарите денежку!