САЙТОСТРОЙ.РУ
Построй свой сайт!

Заспускаем PHP 7 параллельно с прежней версией

опубликовано 15.07.2015

Не прошло и недели с тех пор, как общественности была представлена первая бета-версия новомодного PHP 7. Этот релиз, как сказано в ленте новостей, не для продакшн-серверов, однако пробовать имеет смысл уже сейчас, чтобы подготовиться к предстоящему переходу на эту ветку интерпретатора. Я расскажу о том, как запустить PHP 7 параллельно с той версией, которая установлена на Вашем сервере (например, ветки 5.3 или 5.5/5.6).

В качестве фронт-енда мы будем использовать Nginx, который будет через интерфейс FastCGI вызывать наш PHP-FPM. Для того, чтобы версии не конфликтовали, мы заведём отдельный PHP-FPM с новым скриптом запуска в /etc/init.d/, а вызов будет производиться с отдельного хоста. При этом можно запускать одни и те же скрипты двумя разными интерпретаторами, обращаясь к ним по разным хостам. В последствии можно будет плавно перевести этот новый хост на место старого.

 

Компилируем и устанавливаем PHP 7

Предварительные версии интерпретатора доступны с официального сервера PHP. Загрузим свежую версию (может быть, Вы увидете уже что-то более новое, чем Beta 1), распакуем и запустим configure:

# wget https://downloads.php.net/~ab/php-7.0.0beta1.tar.xz
# tar xf php-7.0.0beta1.tar.xz
# cd php-7.0.0beta1
# ./configure --prefix=/usr/local/php7 --with-config-file-path=/usr/local/php7/etc --enable-fpm --disable-cgi --disable-ipv6 --enable-bcmath --enable-ftp --enable-mbstring --enable-embedded-mysqli --enable-sockets --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd

Здесь я выбрал те модули, которые необходимы для моих сайтов. Советую пробежаться по опциям configure, набрав:

# ./configure --help

Если вкратце, то я разрешил PHP-FPM, bcmath, FTP, mbstring, и mysqli, но запретил CGI и IPv6.

Обратите внимание, что я использовал параметр --prefix, чтобы задать стартовую директорию для этой версии PHP. Это необходимо для того, чтобы не возникло конфликтов со старой версией - я хочу сохранить обе версии. 

Теперь можем запускать компиляцию и установку:

# make; make install

 

Запускаем PHP-FPM для работы с PHP 7

Теперь запустим копию php-fpm, которая будет обслуживать PHP 7. В нашем случае он будет располагаться здесь: /usr/local/php7/sbin/php-fpm. Давайте применим конфигурацию по умолчанию:

# cd /usr/local/php7/etc/
# cp php-fpm.conf.default php-fpm.conf

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

# cp /etc/php-fpm.d/* /usr/local/php7/etc/php-fpm.d/*

Внутри я советую заменить название секции на уникальную, чтобы лучше отличать её в списке процессов. Например, переименовать [www] в [www-php7]. Так же потребуется изменить директиву listen, указав уникальное размещение для сокета (это справедливо, если Вы пользуетесь UNIX-сокетами). Например, сделаем так:

listen = /tmp/php7-fpm-www.sock

Теперь нам нужен скрипт запуска php-fpm. Создадим его из имеющегося:

# cp /etc/init.d/php-fpm /etc/init.d/php7-fpm

Нам нужно поменять всюду строку "php-fpm" на "php7-fpm" (или как Вы сами захотите назвать) (кроме путей). Например, PID-файл может находиться здесь:

/var/run/php-fpm/php7-fpm.pid

Поправим так же пути к исполняемому файлу php-fpm:

daemon --pidfile ${pidfile} /usr/local/php7/sbin/php-fpm --daemonize

Чтобы Вам было проще сориентироваться в изменениях, привожу вывод команды diff:

28,29c28,29
< if [ -f /etc/sysconfig/php-fpm ]; then
<       . /etc/sysconfig/php-fpm
---
> if [ -f /etc/sysconfig/php7-fpm ]; then
>       . /etc/sysconfig/php7-fpm
39,40c39,40
< pidfile=${PIDFILE-/var/run/php-fpm/php-fpm.pid}
< lockfile=${LOCKFILE-/var/lock/subsys/php-fpm}
---
> pidfile=${PIDFILE-/var/run/php-fpm/php7-fpm.pid}
> lockfile=${LOCKFILE-/var/lock/subsys/php7-fpm}
46c46
<       daemon --pidfile ${pidfile} /usr/sbin/php-fpm --daemonize
---
>       daemon --pidfile ${pidfile} /usr/local/php7/sbin/php-fpm --daemonize
53c53
<       killproc -p ${pidfile} php-fpm
---
>       killproc -p ${pidfile} php7-fpm
68c68
<       if ! /usr/sbin/php-fpm --test ; then
---
>       if ! /usr/sbin/php7-fpm --test ; then
73c73
<               killproc -p ${pidfile} php-fpm -USR2
---
>               killproc -p ${pidfile} php7-fpm -USR2
89c89
<       status -p ${pidfile} php-fpm
---
>       status -p ${pidfile} php7-fpm
99c99
<       /usr/sbin/php-fpm --test
---
>       /usr/local/php7/sbin/php-fpm --test

С этого момента мы можем запускать обработчик, набрав команду:

/etc/init.d/php7-fpm

 

Просим Nginx выполнять запросы через новый обработчик

Теперь у нас есть обработчик, но запросы всё ещё идут на старый. Исправим эту ситуацию, создав новую секцию server в nginx, адресовав её к другому fastcgi-серверу. Непосредственный участок конфигурации выглядит так:

fastcgi_pass   unix:/tmp/php7-fpm-saytostroy.sock;

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

теги: php, php-fpm, nginx

Комментарии и вопросы

Статью никто не комментировал.


Задать вопрос или оставить комментарий

Ваше имя:
Комментарий:
Код с картинки справа:=


Просим с уважением относиться к труду автора сайта и при копировании документов указывать ссылки на http://saytostroy.ru.