Не прошло и недели с тех пор, как общественности была представлена первая бета-версия новомодного 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 обрабатывает наши запросы.
Комментарии и вопросы
Статью никто не комментировал.
Задать вопрос или оставить комментарий