Статьи

Одновременно работает несколько версий PHP

Часто я нахожусь в ситуации, когда я застреваю с ответственностью какого-то очень грязного старого кода, работающего на какой-то действительно старой версии PHP (ну, по крайней мере, ветка 5.2). В то же время я также застрял с некоторыми действительно грязными, но очень новыми и экспериментальными вещами, использующими новейший PHP.

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

Вы говорите, что для первого сценария я застрял в куче блоков разработки. Или виртуальные машины, если мне повезет больше, говорите? И для последнего сценария, я должен сделать много массовых обновлений и массовых снижений пакетов PHP, расширений и библиотек и так далее?

Так получилось, что я использую Gentoo . И угадай что? Gentoo поддерживает параллельную работу нескольких минорных версий PHP!

Фактически, это были некоторые случаи использования для переписывания пакетов PHP для Gentoo. Большинство дистрибутивов поддерживают параллельную установку основных версий PHP. По крайней мере, Debian / Ubuntu имеет основную версию PHP как часть имени пакета. Вы можете быть судьей, если это действительно что-то значит сейчас, когда PHP 4 забыл (как и PHP 6, кажется). В любом случае, именно в младших версиях расширение ABI PHP нарушено, и все новые интересные функции добавлены. Это версии, которые вы хотите установить параллельно.

В любом случае, достаточно tarradiddle. Теперь я покажу вам, как настроить этот маленький кусочек магии, шаг за шагом, команду за командой, изменение строки за изменением строки.

Шаг 1: появляющийся PHP

PHP имеет огромное количество доступных USE-флагов. К счастью, USE-флаги, которые устанавливаются по умолчанию в PHP-сборках, достаточно нормальны, поэтому нам нужно добавить только USE-флаг cgi, который дает нам API-интерфейс сервера FastCGI. Я считаю, что включение cgi в качестве глобального USE-флага в /etc/make.conf — плохая идея, поскольку меня не волнует включение поддержки cgi для каждого отдельного пакета в дереве, поддерживающего такую ​​вещь. Если вы похожи на меня, вы можете добавить его в /etc/portage/package.use. Просто добавьте туда следующую строку:

dev-lang/php cgi

Это все, что вам нужно для настройки PHP. Теперь появиться!

emerge -av php

Шаг 2: Установка расширений

Нам всем нужно установить несколько расширений. Поскольку мы собираемся запустить как PHP 5.2, так и PHP 5.3, давайте включим создание расширений для обоих. Перетащите следующую строку в /etc/make.conf

PHP_TARGETS="php5-2 php5-3"

Вероятно, вы собираетесь использовать эту систему для разработки, поэтому вам понадобится хотя бы xdebug. Вы также, вероятно, хотите pecl-memcached. Если нет, просто выберите несколько других пакетов для установки, просто для удовольствия.

emerge -av xdebug pecl-memcached

These are the packages that would be merged, in order:

Calculating dependencies... done!

[ebuild N ] dev-php5/xdebug-2.1.0-r1 PHP _TARGETS="php5-2 php5-3" 0 kB [0]

[ebuild N ] dev-php5/pecl-memcached-1.0.2-r2 [1.0.2-r1] USE="session" PHP_TARGETS="php5-2 php5-3" 0 kB [0]

Обратите внимание на бит PHP_TARGETS? Это магия, которая позволяет создавать расширения для нескольких версий PHP. Вы можете прочитать больше об этом в документации Gentoo PHP .

Шаг 3: Настройка веб-серверов

Теперь мы готовы настроить несколько серверов. Сначала создайте тестовый код. Обе настройки сервера будут работать с одним и тем же кодом. Сценарий, который мы сейчас хотим протестировать, — это запуск двух разных приложений на одном сервере с разными версиями PHP.

Сначала создайте каталоги /var/www/localhost/php5.2 и /var/www/localhost/php5.3 и поместите следующий скрипт в них обоих. Назовите файлы index.php. Не стесняйтесь вставлять одну ссылку в другую, если хотите сохранить несколько байтов.

<?php

phpinfo();

Шаг 3а: Установка и настройка Apache

Apache является доверенным членом стека LAMP и, вероятно, веб-сервером, с которым большинство людей знакомо. В дополнение к www-серверам / apache, нам нужно установить еще один пакет для работы fastcgi: www-apache / mod_fastcgi.

Итак, давайте установим то, что нам нужно:

emerge apache mod_fastcgi

После того, как все было установлено, просто включите его в /etc/conf.d/apache2:

APACHE2_OPTS="-D DEFAULT_VHOST -D INFO -D LANGUAGE -D USERDIR -D FASTCGI"

Я не нашел удобного способа запуска нескольких версий PHP под одним и тем же виртуальным хостом, поэтому вам придется настроить несколько локальных имен хостов. Не важно, просто поместите следующее в / etc / hosts

127.0.0.1 5-3.localhost 5-2.localhost

Как только это будет сделано, поместите следующие файлы виртуальных хостов в /etc/apache2/vhosts.d

/etc/apache2/vhosts.d/5-2.localhost.conf

<VirtualHost *:80>

ServerName 5-2.localhost

DocumentRoot /var/www/localhost/htdocs/php5.2

<IfModule mpm_peruser_module>

ServerEnvironment apache apache

</IfModule>

AddHandler php5-fastcgi .php

FastCgiServer /usr/lib/php5.2/bin/php-cgi

<Directory /var/www/lighttpd/htdocs/php5.2>

Order deny,allow

Allow from all

</Directory>

</VirtualHost>

/etc/apache2/vhosts.d/5-3.localhost.conf

<VirtualHost *:80>

ServerName 5-3.localhost

DocumentRoot /var/www/localhost/htdocs/php5.3

<IfModule mpm_peruser_module>

ServerEnvironment apache apache

</IfModule>

AddHandler php5-fastcgi .php

FastCgiServer /usr/lib/php5.3/bin/php-cgi

<Directory /var/www/lighttpd/htdocs/php5.3>

Order deny,allow

Allow from all

</Directory>

</VirtualHost>

Вот и все. Теперь вы сможете ввести http: //php5-3.localhost/index.php и http: //php5-2.localhost/index.php, чтобы проверить свои настройки.

Шаг 3б: Установка и настройка Lighttpd

Во-первых, убедитесь, что в вашей системе включен флаг USE php. Еще раз зайдите в ваш /etc/portage/package.use и добавьте следующую строку:

www-server/lighttpd php

Тогда появляются lighttpd

emerge -av lighttpd

Замените содержимое /etc/lighttpd/mod_fastcgi.conf следующим текстом:

server.modules += ("mod_fastcgi")

$HTTP["url"] =~ "^/php5.2/.+\.php$" {

fastcgi.server = ( ".php" => (

"localhost" => (

"socket" => "/var/run/lighttpd/lighttpd-fastcgi-php5-2-" + PID + ".socket",

"bin-path" => "/usr/lib64/php5.2/bin/php-cgi"

)

)

)

}

$HTTP["url"] =~ "^/php5.3/.+\.php$" {

fastcgi.server = ( ".php" => (

"localhost" => (

"socket" => "/var/run/lighttpd/lighttpd-fastcgi-php5-3-" + PID + ".socket",

"bin-path" => "/usr/lib64/php5.3/bin/php-cgi"

)

)

)

}

# vim: set ft=conf foldmethod=marker et :

Вот и все. Теперь вы сможете ввести http: //localhost/php5.2/index.php и http: //localhost/php5.3/index.php, чтобы проверить свои настройки.

Вывод

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