Тематические термины: PHP, Apache, CentOS, веб-сервер.
В большинстве случаев, для индивидуального использования веб-сервера, достаточно одной версии PHP. Но на хостингах или при ведении нескольких проектов, написанных на разных версиях PHP, необходимо, чтобы виртуальные домены сервера могли поддерживать разные версии интерпретатора.
В данной инструкции рассмотрена настройка на примере веб-сервера Apache, работающего на операционной системе Linux CentOS 7. Подразумевается, что сам веб сервер настроен, например, по статье Как настроить полноценный веб-сервер на CentOS. После конфигурирования у нас будет две версии php на одном сервере Apache.
Предположим, на нашем сервере уже установлен 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.
… используя ссылку, скачиваем исходник на сервер:
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 GroupZend 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 отработала.
Таким образом, обработка ошибок носит индивидуальный характер. Как правило искать решение необходимо в Интернете.
Для настройки веб-сервера необходимо подключить к нему нашу новую версию php и настроить виртуальные домены. В нашем примере мы настроим один виртуальный домен для php 5.4.16, второй — 5.2.17.
Устанавливаем 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/shPHPRC=»/opt/php-5.2.17/»export PHPRCPHP_FCGI_CHILDREN=4export PHP_FCGI_CHILDRENPHP_FCGI_MAX_REQUESTS=5000export PHP_FCGI_MAX_REQUESTSexec /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 warnOptions -Indexes +FollowSymLinks +ExecCGIRequire all granted</Directory><FilesMatch «\.php»>SetHandler application/x-httpd-php5</FilesMatch>ScriptAlias /php5-2-17-cgi /usr/lib/cgi-bin/php5-2-17-cgiAction application/x-httpd-php5 /php5-2-17-cgiAddHandler 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:
Укажем, что тестовые домены — это наш веб-сервер:
192.168.0.15 test-php5-4-16.local192.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.
Открываем браузер и заходим на два наших домена:
Мы должны увидеть сводку php с разными версиями:
После запуска двух версий 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
Собираем его и устанавливаем:
Установка должна выполниться быстро, а после мы должны увидеть что-то на подобие:
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=300stop_on_error = 0
* где /opt/php-5.2.17/lib/php/extensions/no-debug-non-zts-20060613/ — путь, который мы получили после установки htscanner.
Готово — в phpinfo должен появиться модуль htscanner и php_value с php_flag должны передаваться с помощью htaccess.
Продолжая использовать данный сайт вы принимаете политику конфиденциальности и cookies