Запуск нескольких версий php

Дано

Дистрибутив — Debian Jessie (systemd) x86_64
Php — 5.6
Nginx — 1.6.1

Проблема

Запустить на одном сервере/рабочей станции кучу разного кода, в том числе дремучего legacy

Решаем

Сразу оговорюсь, все версии php собираем руками, пакеты готовить не будем. Так как будем собирать довольно древний софт, то заранее подготовим некоторые моменты

Установим необходимый софт
sudo apt-get install libxml-perl libxpm-dev libsigc++-2.0-dev \
libmysqlclient18 libmysqlclient-dev icu-devtools libicu-dev libedit-dev \
libreadline-dev libsnmp-dev libxslt1-dev libpspell-dev  \
libxml2 libxml2-dev pkg-config libbz2-dev libcurl4-openssl-dev \
libmcrypt-dev libmhash-dev libg2-dev libgd2-xpm-dev\
build-essential sqlite sqlite3 libsqlite0-dev libsqlite0 \
libsqlite3-0 libsqlite3-dev libfreetype6-dev \
libt1-5 libt1-dev (для jessie этого пакета не было, вытащил из wheezy)

php 5.2.17

Берем исходники
wget -c http://museum.php.net/php5/php-5.2.17.tar.bz2
tar -xjf php-5.2.17.tar.bz2
Немного магии
sudo ln -s /usr/lib /usr/lib64
sudo mkdir -p /usr/include/freetype2/freetype
sudo ln -s /usr/include/freetype2/freetype.h /usr/include/freetype2/freetype/freetype.h
sudo ln -s /usr/lib/x86_64-linux-gnu/libXpm.so.4 /usr/lib/libXpm.so
sudo ln -s /usr/lib/x86_64-linux-gnu/libpng.so /usr/lib/
sudo ln -s /usr/lib/x86_64-linux-gnu/libjpeg.so /usr/lib/
sudo ln -s /usr/lib/x86_64-linux-gnu/libgd.so.3 /usr/lib/libgd.so
cd php-5.2.17/
wget -c http://packages.gwinn.ru/patches/php/5.2.17/libxml29_compat.patch
patch -p0 < libxml29_compat.patch
Собираем

./configure --prefix=/opt/php/5.2 \
--with-libdir=lib64 \
--with-layout=GNU \
--enable-gd-jis-conv \
--enable-gd-native-ttf \
--enable-mbregex \
--enable-calendar \
--enable-exif \
--enable-magic-quotes \
--enable-force-cgi-redirect \
--enable-gd-jis-conv \
--enable-pcntl \
--enable-sockets \
--enable-fastcgi \
--enable-ftp \
--enable-posix=shared \
--enable-mbstring=shared \
--enable-bcmath=shared \
--enable-soap=shared \
--enable-wddx=shared \
--enable-zip=shared \
--enable-dbase=shared \
--enable-pdo=shared \
--enable-json=shared \
--with-pic \
--with-bz2 \
--with-readline \
--with-gettext \
--with-iconv \
--with-pcre-regex \
--with-zlib \
--with-freetype-dir=/usr \
--with-png-dir=/usr \
--with-jpeg-dir=/usr \
--with-xpm-dir=/usr \
--with-t1lib=/usr \
--with-libxml-dir=/usr \
--with-mysql=shared,/usr \
--with-mysqli=shared,/usr/bin/mysql_config \
--with-pgsql=shared,/usr \
--with-curl=shared,/usr \
--with-sqlite=shared,/usr \
--with-pdo-mysql=shared,/usr \
--with-pdo-pgsql=shared,/usr \
--with-pdo-sqlite=shared,/usr \
--with-pdo-odbc=shared,unixODBC,/usr \
--with-xmlrpc=shared \
--with-pspell=shared \
--with-xsl=shared,/usr \
--with-snmp=shared,/usr \
--with-mcrypt=shared,/usr \
--with-mhash=shared,/usr \
--with-ttf=shared,/usr \
--with-gd=shared,/usr \
--disable-rpath \
--disable-debug \
--without-pear \
--without-gdbm
make && sudo make install
Пишем php.ini
sudo vim /opt/php/5.2/etc/php.ini
date.timezone = 'Europe/Moscow'
cgi.fix_pathinfo = 0
magic_quotes_gpc = Off

extension=bcmath.so
extension=curl.so
extension=dbase.so
extension=gd.so
extension=json.so
extension=mbstring.so
extension=mcrypt.so
extension=mhash.so
extension=mysqli.so
extension=mysql.so
extension=pdo_mysql.so
extension=pdo_odbc.so
extension=pdo_pgsql.so
extension=pdo.so
extension=pdo_sqlite.so
extension=pgsql.so
extension=posix.so
extension=pspell.so
extension=snmp.so
extension=soap.so
extension=sqlite.so
extension=wddx.so
extension=xmlrpc.so
extension=xsl.so
extension=zip.so

# Пример добавленного расширения после сборки php
zend_extension=/opt/php/5.2/lib/php/20060613/ZendOptimizer.so
Добавляем настройки окружения для запуска php-cgi
sudo vim /opt/php/5.2/etc/php.env
PHP_FCGI_CHILDREN=4
PHP_FCGI_MAX_REQUESTS=5000
Создаем юнит для автозапуска
sudo vim /etc/systemd/system/php52.service
[Unit]
Description=php-cgi v.5.2 process

[Service]
EnvironmentFile=-/opt/php/5.2/etc/php.env
ExecStart=/opt/php/5.2/bin/php-cgi -b 127.0.0.1:9001 -c /opt/php/5.2/etc/php.ini
# ИЛИ ЖЕ ЧЕРЕЗ СОКЕТ
# ExecStart=/opt/php/5.2/bin/php-cgi -b /var/run/php52.sock -c /opt/php/5.2/etc/php.ini

[Install]
WantedBy=multi-user.target
sudo systemctl enable php52
sudo service php52 start
Nginx

В конфигах nginx указываем fastcgi_pass 127.0.0.1:9001 или fastcgi_pass unix:/var/run/php52.sock;

php 5.3.29

Конфигурируем
./configure --prefix=/opt/php/5.3 \
--with-config-file-path=/opt/php/5.3 \
--with-libdir=/usr/lib/x86_64-linux-gnu \
--with-bz2 \
--with-curl \
--with-gettext \
--with-libedit \
--with-mcrypt \
--with-mhash \
--with-mysql \
--with-pdo-mysql \
--with-pdo-pgsql \
--with-pgsql \
--with-pspell \
--with-readline \
--with-snmp \
--with-xmlrpc \
--with-xsl \
--with-zlib \
--enable-bcmath \
--enable-calendar \
--enable-intl \
--enable-ftp \
--enable-mbstring \
--enable-pcntl \
--enable-soap \
--enable-sockets \
--enable-sqlite-utf8 \
--enable-zip \
--disable-debug
Немного магии

В сгенерированном Makefile находим строчку, которая начинается на EXTRA_LIBS и добавляем сразу после знака равно

-lstdc++
Собираем
make && sudo make install
Пишем php.ini
sudo vim /opt/php/5.3/etc/php.ini
date.timezone = 'Europe/Moscow'
# Пример добавленного расширения после сборки php
zend_extension=/opt/php/5.3/lib/php/ext/ZendOptimizer.so
Добавляем настройки окружения для запуска php-cgi
sudo vim /opt/php/5.3/etc/php.env
PHP_FCGI_CHILDREN=4
PHP_FCGI_MAX_REQUESTS=5000
Создаем юнит для автозапуска
sudo vim /etc/systemd/system/php53.service
[Unit]
Description=php-cgi v.5.3 process

[Service]
EnvironmentFile=-/opt/php/5.3/etc/php.env
ExecStart=/opt/php/5.3/bin/php-cgi -b 127.0.0.1:9002 -c /opt/php/5.3/etc/php.ini
# ИЛИ ЖЕ ЧЕРЕЗ СОКЕТ
# ExecStart=/opt/php/5.3/bin/php-cgi -b /var/run/php53.sock -c /opt/php/5.3/etc/php.ini

[Install]
WantedBy=multi-user.target
sudo systemctl enable php53
sudo service php53 start
Nginx

В конфигах nginx указываем fastcgi_pass 127.0.0.1:9002 или fastcgi_pass unix:/var/run/php53.sock;

php 5.4 и php 5.5

Собираются без магии, по тому же принципу что и остальные версии

i386

Особых отличий от x86_64 не будет, разве что —with-libdir=/usr/lib/x86_64-linux-gnu надо будет заменить на —with-libdir=/usr/lib/i386-linux-gnu

Запуск нескольких версий php

Запуск нескольких версий php: 5 комментариев

    1. gwinn:

      Ага, еще phpenv есть, но я со времен пользования rbenv этот метод не очень люблю, к тому же, на сервере, имхо, такие штуки использовать не комильфо.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *