Добавление еще одной версии PHP в Apache на CentOS 7

Обновлено Обновлено: Опубликовано Опубликовано:

Тематические термины: PHP, Apache, CentOS, веб-сервер.

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

В данной инструкции рассмотрена настройка на примере веб-сервера Apache, работающего на операционной системе Linux CentOS 7. Подразумевается, что сам веб сервер настроен, например, по статье Как настроить полноценный веб-сервер на CentOS. После конфигурирования у нас будет две версии php на одном сервере Apache.

Установка еще одной версии PHP

Предположим, на нашем сервере уже установлен PHP версии 5.4.16. Добавим PHP 5.2.17.

Устанавливаем пакеты, которые нам понадобятся для сборки интерпретатора:

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:

mkdir /opt/php-5.2.17

Создаем каталог для исходников:

mkdir /usr/local/src/php

… и перейдем в него:

cd /usr/local/src/php

Переходим на страницу museum.php.net/php5 и копируем ссылку на нужную версию PHP:

Копируем ссылку на PHP 5.2.17

* в нашем примере, php-5.2.17.

… используя ссылку, скачиваем исходник на сервер:

wget https://museum.php.net/php5/php-5.2.17.tar.gz

* если CentOS вернет ошибку, необходимо установить wget командой yum install wget.

Распаковываем скачанный исходник:

tar zxvf php-*.tar.gz

После переходим в каталог с распакованными файлами:

cd php-5.2.17

Сконфигурируем исходники:

./configure —prefix=/opt/php-5.2.17 —with-config-file-path=/opt/php-5.2.17 —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

Собираем пакет и устанавливаем его:

make install

Готово. Проверяем:

/opt/php-5.2.17/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 5.2.17 в моем случае появилась ошибка «доступ по указателю на неполный тип ret = buf->buffer->use;». Для решения проблемы необходимо было установить утилиту patch:

yum install patch

Скачать патч для php нужной версии:

wget https://admins24.com/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/php5-2-17-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

Разрешаем запуск его на исполнение:

chmod +x /usr/lib/cgi-bin/php5-2-17-cgi

Создаем конфигурационный файл для httpd:

vi /etc/httpd/php5-2-17.conf

<Directory /usr/lib/cgi-bin/>
LogLevel warn
Options -Indexes +FollowSymLinks +ExecCGI
Require all granted
</Directory>
<FilesMatch «\.php»>
SetHandler application/x-httpd-php5
</FilesMatch>
ScriptAlias /php5-2-17-cgi /usr/lib/cgi-bin/php5-2-17-cgi
Action application/x-httpd-php5 /php5-2-17-cgi
AddHandler application/x-httpd-php5 .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

… если видим:

Перезапускаем сервис:

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.

Открываем браузер и заходим на два наших домена:

  1. http://test-php5-4-16.local/
  2. http://test-php5-2-17.local/

Мы должны увидеть сводку php с разными версиями:

phpinfo для 5.4.16

phpinfo для 5.2.17

Обработка php_value в .htaccess

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

Установим пакет, необходимый для компиляции расширений php:

yum install autoconf

Заходим на страницу проекта и копируем ссылку на последнюю стабильную версию:

Ссылка на загрузку htscanner

С помощью ссылки загружаем на сервер исходник:

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 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.