Вся информация и фото, взяты с https://www.dmosk.ru/miniinstruktions.php?mini=php-multiply
Тематические термины: PHP, Apache, CentOS, веб-сервер.
В большинстве случаев, для индивидуального использования веб-сервера, достаточно одной версии PHP. Но на хостингах или при ведении нескольких проектов, написанных на разных версиях PHP, необходимо, чтобы виртуальные домены сервера могли поддерживать разные версии интерпретатора.
В данной инструкции рассмотрена настройка на примере веб-сервера Apache, работающего на операционной системе Linux CentOS 7. Подразумевается, что сам веб сервер настроен, например, по статье Как настроить полноценный веб-сервер на CentOS. После конфигурирования у нас будет две версии php на одном сервере Apache.
Добавление новой версии PHP
Настройка веб-сервера
Подключение php
Настройка виртуальных доменов
Тестирование
php_value в .htaccess
Установка еще одной версии PHP
Предположим, на нашем сервере уже установлен PHP версии 5.4.16. Добавим PHP 5.2.17 (также протестировано с версией 7.4.30).
Устанавливаем пакеты, которые нам понадобятся для сборки интерпретатора:
yum install epel-release
yum install wget libxml2-devel openssl-devel libcurl-devel libjpeg-devel libpng-devel bzip2-devel freetype-devel aspell-devel uw-imap-devel libmcrypt-devel libmhash-devel mysql-devel postgresql-devel gcc
* данный набор пакетов не является полным. Например, для PHP версии 7 или для установки дополнительных модулей могут потребоваться другие пакеты. Тут уже нужно ориентироваться по ситуации — получив ошибку при конфигурировании, найти описании проблемы и выполнить соответствующую установку.
Создаем каталог для исходников:
mkdir /usr/local/src/php
… и перейдем в него:
cd /usr/local/src/php
Заходим на страницу загрузки PHP. В зависимости от версии, это будут разные ссылки. Для устаревших версий:
- PHP 5 — museum.php.net/php5.
- PHP 7 — museum.php.net/php7.
- PHP 8 — museum.php.net/php8.
Для актуальных версий — php.net/downloads.
Так как в нашем примере мы устанавливаем PHP 5, переходим по соответствующей ссылке и копируем путь для загрузки исходника:

… используя ссылку, скачиваем исходник на сервер:
wget https://museum.php.net/php5/php-5.2.17.tar.gz
* если CentOS вернет ошибку, необходимо установить wget командой yum install wget.
Для удобства, сохраняем устанавливаемую версию PHP в переменную:
PHP_VER=’5.2.17′
Создаем каталог для установки PHP:
mkdir /opt/php-$PHP_VER
Распаковываем скачанный исходник:
tar zxvf php-*.tar.gz
После переходим в каталог с распакованными файлами:
cd php-*/
Сконфигурируем исходники:
./configure —prefix=/opt/php-$PHP_VER —with-config-file-path=/opt/php-$PHP_VER —with-pdo-pgsql —with-zlib-dir —with-freetype-dir —enable-mbstring —with-libxml-dir=/usr —enable-soap —enable-calendar —with-curl=/usr/bin —with-mcrypt —with-zlib —with-gd —with-pgsql —disable-rpath —enable-inline-optimization —with-bz2 —with-zlib —enable-sockets —enable-sysvsem —enable-sysvshm —enable-pcntl —enable-mbregex —with-mhash —enable-zip —with-pcre-regex —with-mysql —with-pdo-mysql —with-mysqli —with-jpeg-dir=/usr/lib64 —with-libdir=lib64 —with-png-dir=/usr —enable-gd-native-ttf —with-openssl —enable-ftp —with-imap —with-imap-ssl —with-kerberos —with-gettext —enable-cli —enable-fastcgi —enable-discard-path —enable-force-cgi-redirect —enable-cgi —enable-bcmath
* при конфигурировании, мы можем получить различные ошибки, связанные с нехваткой компонентов. Для решения данного типа проблем, необходима установка дополнительных пакетов. Что это за пакеты — необходимо разобраться самостоятельно.
Также мы, скорее всего, столкнемся с предупреждением configure: WARNING: unrecognized options. Это значит, что некоторые опции не отработали. Такое случается, так как от версии к версии некоторые из них больше не работают или имеют немного другое написание, например не —with-gd, а —enable-gd. Изучите предупреждение и исправьте недочеты.
Собираем пакет и устанавливаем его:
make
make install
Готово. Проверяем:
/opt/php-$PHP_VER/bin/php -v
… получим, примерно, такой ответ:
PHP 5.2.17 (cli) (built: Jul 2 2019 13:37:49)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies
Ошибки установки и их устранение
Во время ручной сборки и установки пакетов, как правило, возникают проблемы. Попробуем описать алгоритм их диагностики и решения.
Ошибки зависимостей
Проще всего решить те, которые связаны с зависимостями — для этого нужно просто установить недостающий компонент. Такие проблемы возникают на стадии конфигурирования (./configure). Например, для PHP версии 7 в нашем примере может появиться ошибка:
No package ‘oniguruma’ found
Она говорит о том, что для сборки в системе нет dev-пакета с библиотеками регулярных выражений Oniguruma. Для решения ставим пакет:
yum install oniguruma-devel
Индивидуальные ошибки
Также проблемы могут возникнуть во время сборки исходника, например, при установке php 5.2.17 в моем случае появилась ошибка «доступ по указателю на неполный тип ret = buf->buffer->use;». Для решения проблемы необходимо было установить утилиту patch:
yum install patch
Скачать патч для php нужной версии:
wget https://www.dmosk.ru/files/php-5.2.17.patch
… и применить его:
patch -p0 < php-5.2.17.patch
После команда make отработала.
Таким образом, обработка ошибок носит индивидуальный характер. Как правило искать решение необходимо в Интернете.
Настройка apache
Для настройки веб-сервера необходимо подключить к нему нашу новую версию php и настроить виртуальные домены. В нашем примере мы настроим один виртуальный домен для php 5.4.16, второй — 5.2.17.
Подключение новой версии PHP к httpd
Устанавливаем mod_fcgid для httpd:
yum install mod_fcgid
Создаем каталог /usr/lib/cgi-bin:
mkdir /usr/lib/cgi-bin
… в него поместим скрипт, который будет запускаться при обработке php-скриптов:
vi /usr/lib/cgi-bin/php$PHP_VER-cgi
#!/bin/sh
PHPRC=»/opt/php-5.2.17/»
export PHPRC
PHP_FCGI_CHILDREN=4
export PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_MAX_REQUESTS
exec /opt/php-5.2.17/bin/php-cgi
* где /opt/php-5.2.17 — путь, по которому была установлена дополнительная версия PHP. Он будет зависеть от версии программного продукта.
Разрешаем запуск его на исполнение:
chmod +x /usr/lib/cgi-bin/php$PHP_VER-cgi
Создаем конфигурационный файл для httpd:
vi /etc/httpd/php$PHP_VER.conf
<Directory /usr/lib/cgi-bin/>
LogLevel warn
Options -Indexes +FollowSymLinks +ExecCGI
Require all granted
</Directory>
<FilesMatch «\.php»>
SetHandler application/x-httpd-php5.2.17
</FilesMatch>
ScriptAlias /php5.2.17-cgi /usr/lib/cgi-bin/php5.2.17-cgi
Action application/x-httpd-php5.2.17 /php5.2.17-cgi
AddHandler application/x-httpd-php5.2.17 .php
Настройка виртуальных доменов
Создаем первый виртуальный домен:
vi /etc/httpd/conf.d/test-php5-4-16.conf
<VirtualHost *:80>
ServerName test-php5-4-16.local
DocumentRoot /var/www/test-php
<Directory /var/www/test-php>
Options Indexes FollowSymLinks
AllowOverride all
Require all granted
</Directory>
</VirtualHost>
Создаем второй виртуальный домен:
vi /etc/httpd/conf.d/test-php5-2-17.conf
<VirtualHost *:80>
Include php5.2.17.conf
ServerName test-php5-2-17.local
DocumentRoot /var/www/test-php
<Directory /var/www/test-php>
Options Indexes FollowSymLinks
AllowOverride all
Require all granted
</Directory>
</VirtualHost>
* обратите внимание, что для первого хоста мы используем php, который используется в нашей системе по умолчанию. Для второго домена мы подключаем конфигурационный файл php5-2-17.conf. Также мы будем использовать одну и туже директорию для DocumentRoot — для тестовых задач этого достаточно.
Проверяем конфигурацию Apache:
apachectl configtest
… если видим:
Syntax OK
Перезапускаем сервис:
systemctl restart httpd
Создание тестового сайта и проверка настроек
Создаем каталог для нашего тестового сайта:
mkdir /var/www/php-test
Создаем сайт, содержимое которого — один единственный скрипт:
vi /var/www/php-test/index.php
<?php
phpinfo();
?>
На рабочем компьютере открываем файл hosts:
- Для Linux: /etc/hosts
- Для Windows: \Windows\System32\drivers\etc\hosts
Укажем, что тестовые домены — это наш веб-сервер:
192.168.0.15 test-php5-4-16.local
192.168.0.15 test-php5-2-17.local
* где 192.168.0.15 — IP-адрес моего сервера; test-php5-4-16.local — домен для проверки версии php 5.4.16; test-php5-2-17.local — домен для проверки версии php 5.2.17.
Открываем браузер и заходим на два наших домена:
- http://test-php5-4-16.local/
- http://test-php5-2-17.local/
Мы должны увидеть сводку php с разными версиями:


Обработка php_value в .htaccess
После запуска двух версий php, мы вскоре можем заметить, что вторая (та, что не по умолчанию) не воспринимает настройки php_value из файла .htaccess. Эта проблема связана с тем, что вторичные php мы запустили через php-cgi. Для того, чтобы нужные параметры могли задаваться с помощью htaccess, необходимо установить расширение htscanner.
Установим пакет, необходимый для компиляции расширений php:
yum install autoconf
Заходим на страницу проекта и копируем ссылку на последнюю стабильную версию:

С помощью ссылки загружаем на сервер исходник:
wget https://pecl.php.net/get/htscanner-1.0.1.tgz
… и распаковываем его:
tar -xvzf htscanner-*.tgz
… и после переходим в распакованную папку:
cd htscanner-*
Компилируем расширение:
/opt/php-5.2.17/bin/phpize
* обратите внимание, что мы запускаем phpize из каталога той версии php, которую ставили дополнительно.
Конфигурируем исходник:
./configure —enable-htscanner —with-php-config=/opt/php-5.2.17/bin/php-config
Собираем его и устанавливаем:
make
make install
Установка должна выполниться быстро, а после мы должны увидеть что-то на подобие:
Installing shared extensions: /opt/php-5.2.17/lib/php/extensions/no-debug-non-zts-20060613/
* в данном примере нужный нам модуль был скопирован в каталог /opt/php-5.2.17/lib/php/extensions/no-debug-non-zts-20060613/
Отредактируем или создадим файл php.ini для новой версии PHP:
vi /opt/php-5.2.17/php.ini
… и добавим:
[htscanner]
extension_dir=»/opt/php-5.2.17/lib/php/extensions/no-debug-non-zts-20060613/»
extension=»htscanner.so»
config_file=».htaccess»
default_docroot=»/»
default_ttl=300
stop_on_error = 0
* где /opt/php-5.2.17/lib/php/extensions/no-debug-non-zts-20060613/ — путь, который мы получили после установки htscanner.
Готово — в phpinfo должен появиться модуль htscanner и php_value с php_flag должны передаваться с помощью htaccess.
Установка расширений PHP
Для нативной версии PHP установка расширений может быть выполнена с помощью пакетного менеджера yum. Но для добавленной версии это не поможет — нам нужно пересобрать интерпретатор с нужными опциями. Это не так сложно. Например, добавим к нашей дополнительной версии PHP расширение iconv.
Еще раз создаем переменную с нужной версией PHP (для удобства дальнейшей работы):
PHP_VER=’5.2.17′
* в нашем примере это версия 5.2.17.
Переходим в каталог и исходником. В нашем примере это:
cd /usr/local/src/php/php-${PHP_VER}/
* если исходника нет, просто скачиваем его еще раз, как делали во время установки.
Смотрим, с какими опциями была сконфигурирована наша дополнительная версия PHP:
/opt/php-$PHP_VER/bin/php -i | grep «Configure»
Выполняем конфигурирование с этими же опциями и добавляем расширение:
./configure —prefix=/opt/php-$PHP_VER —with-config-file-path=/opt/php-$PHP_VER —with-pdo-pgsql —with-zlib-dir —with-freetype-dir —enable-mbstring —with-libxml-dir=/usr —enable-soap —enable-calendar —with-curl=/usr/bin —with-mcrypt —with-zlib —with-gd —with-pgsql —disable-rpath —enable-inline-optimization —with-bz2 —with-zlib —enable-sockets —enable-sysvsem —enable-sysvshm —enable-pcntl —enable-mbregex —with-mhash —enable-zip —with-pcre-regex —with-mysql —with-pdo-mysql —with-mysqli —with-jpeg-dir=/usr/lib64 —with-libdir=lib64 —with-png-dir=/usr —enable-gd-native-ttf —with-openssl —enable-ftp —with-imap —with-imap-ssl —with-kerberos —with-gettext —enable-cli —enable-fastcgi —enable-discard-path —enable-force-cgi-redirect —enable-cgi —enable-bcmath —with-iconv
* напомним, что от версии к версии PHP набор опций и способ включения расширения могут отличаться. Внимательно смотрим статус конфигурирования по его окончании.
Выполняем сборку и устанавливаем наш интерпретатор:
make
make install
Проверяем, что наше расширение подключено. Это можно сделать с помощью вывода phpinfo из командной строки:
/opt/php-$PHP_VER/bin/php -i | grep -i «iconv»
Мы должны увидеть что-то на подобие:
iconv
iconv support => enabled