Несколько версий PHP под одним Apache на Windows

Некоторое время назад мне потребовалось иметь на одном веб-сервере разные версии PHP. Все мануалы, что удалось найти беглым взглядом, подразумевали linux-дистрибутивы, на которые мне не хотелось переносить выношенную в муках конфигурацию apache, установленную на виртуальной Windows Server 2012 R2 (x64). Результат моего удавшегося эксперимента представляю на ваш суд.

Первым делом нужно определиться, какой разрядности (х86 или х64) мы хотим от нашего веб-сервера. С недавних пор, а именно — версии PHP5.5, разработчик стал выпускать стабильные сборки под х64, тогда как ранее подобные билды выпускались энтузиастами. Для наибольшего возможного разброса версий PHP и для наглядного примера остановимся на х86 сборке. Далее я буду указывать версии ПО, заработавшие в моём конкретном случае.

1. Скачиваем Apache 2.4.10 Win32 VC11 на www.apachelounge.com/download
ВНИМАНИЕ! Необходимо иметь на компьютере установленную Visual C++ Redistributable for Visual Studio 2012
Выбор версии обусловлен тем, что сборки VC11 не имеют (согласно отзывам) проблем с производительностью как у VC9, VC10, и могут запускать модули, написанные под оные. Старые версии апача не тестировались.

Установка и базовая настройка веб-сервера разжевана и без меня, поэтому её опускаем.

2. Берём бинарники PHP, windows.php.net/download
Нас интересуют x86 Thread Safe версии. Берем все стабильные версии, которые вас интересуют. Лично у меня заработали начиная с 5.3 до 5.6. Архивные версии так же работают.
Для удобства раскладываем всё по соседним папкам:
image

3. Лезем в конфиги apache.

3.1.1 httpd.conf — Выключаем PHP, если он настроен как модуль к Apache:
#LoadModule php5_module "D:/php/php5.6/php5apache2_4.dll"
#AddType application/x-httpd-php .php
#PHPIniDir "D:/php/php5.6/"


3.1.2 httpd.conf — Включаем модуль FastCGI
LoadModule fcgid_module modules/mod_fcgid.so

Включаем использование его конфигурации:
Include conf/extra/httpd-fcgid.conf


3.2 conf/extra/httpd-fcgid.conf — Оставляем стандартные настройки, кроме первого абзаца:
# Fast CGI module Settings (PHP 5.3, 5.4)

#	FcgidInitialEnv PHPRC "C:\\php"
#	FcgidInitialEnv PATH "C:\\php;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;"
	FcgidInitialEnv SystemRoot "C:\\Windows"
	FcgidInitialEnv SystemDrive "C:"
	FcgidInitialEnv TEMP "C:\\WINDOWS\\TEMP"
	FcgidInitialEnv TMP "C:\\WINDOWS\\TEMP"
	FcgidInitialEnv windir "C:\\WINDOWS"


3.3 conf/extra/httpd-vhost.conf — Прописываем для каждого виртуального хоста настройки (выделено с помощью "||"):
<VirtualHost *:80>
    DocumentRoot "D:/http/web.local/"
    ServerName web.local
ErrorLog "logs/web.local-error.log"
CustomLog "logs/web.local-access.log" common

|| FcgidInitialEnv PHPRC "D:\\php\php5.6" ||
|| FcgidInitialEnv PATH "D:\\php\php5.6;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;" ||

<Directory "D:/http/web.local/">
|| AddHandler fcgid-script .php ||
    Options -Indexes +FollowSymLinks || +ExecCGI ||
|| FcgidWrapper "D:/php/php5.6/php-cgi.exe" .php ||
|| Require all granted ||
</Directory>
</VirtualHost>


Если всё раскладывать по соседним папкам как у меня, то в конфиге виртуального хоста меняем только последние цифры в пути PHP.

Как итог: получаем разные версии PHP на разных виртуальных хостах на одном сервисе Apache.
Share post

Comments 18

    –1
    open-server.ru сводит такие проблемы на «ноль»
      0
      Denwer style, да? Если у меня сконфигурирован апач на Windows для работы, то с похожим конфигом я смогу всё это перенести спокойно и на другую машину и, что не мало важно, на продакш сервер с Ubuntu. Смогу я так же легко это сделать с open server? Нет.

        –1
        1. Для чего вам 10 версий PHP на продакшене?
        2. Для отдельных хостов вопрос использования конкретной версии решается размещением необходимой версии в cgi-bin и соответствующей директивой в .htaccess
          0
          вот можно подробнее? Т.к. я такого способа не нашёл — сделал как уразумел.

          Отвечая на вопрос — в моём случае это была НЕОБХОДИМОСТЬ использовать версию 5.4.27 из-за одного php-модуля (ice). И продолжать использовать 5.6 текущую под сервер синхронизации.
            0
            Такое возможно в т.ч. на виртуальном хостинге.
            Не благодарите.

            masterhost.ru/support/doc/php/#compile
              0
              вот уж спасибо! Нужно больше ненависти.
        –1
        чаще проще собрать самому (и научиться делать), чем ковыряться в чужом
        +3
        установленную виртуальной Windows Server 2012 R2
        — мсьё знает толк в извращениях
          –2
          знает :) мне так удобно, да и сама ОС очень дружелюбна к ресурсам
            0
            Очень дружелюбна. Берет оперативку и уходит с ней куда-то гулять.
              0
              Сервер Apache+PHP+Mysql, несколько виртуальных хостов, на одном почта, на другом синхронизация контактов, пара сайтов-недоделок. Почтовый сервер hMail, сервер Mumble, сервер Chivalry: MW, DNS-сервер, сама винда в десктопном режиме. 1,5 Гб из 4. Впрочем, не собираюсь спорить, каждому — своё.
                0
                Для того что вы описали вполне хватит *nix-vds за 100 р/мес с 512 мегабайтами оперативки на всё.
                  –1
                  да я разве спорю? Но хочется всё своё. Синдром собственника ;)
                    0
                    Чем VDS менее «свой», чем Win Server в виртуалке?
                    (боюсь даже спрашивать, покупали ли вы его)
                      –1
                      обкатываю пробную версию :D

                      тем, что он «у кого-то», а виртуалка дома шуршит. Благо, сама умеет стартовать вместе с системой.
          0
          Vagrant же есть
            –3
            я не разработчик, теги для тех, кто будет искать по ним
            +1
            Заголовок вызывает несколько приступов боли.

            Only users with full accounts can post comments. Log in, please.