Данный туториал нам не подошел, потому что на фирме действует документ, регламентирующий структуру директорий на локалке, и все сайты (около 250) у нас лежат в одной директории. Понимаю и не устаю повторять, что данный документ это полный бред, но начальство не переубедишь. Поэтому возникла необходимость быстро переключаться между версиями PHP ничего никуда не перемещая, без «этих ваших денверов и опынсерверов и прочего, все должно быть с коробки, приду правэрю, иначе уволю!».

И так, структура директорий:

C:\Server\Apache24
C:\Server\PHP55
C:\Server\PHP56
C:\Server\PHP57
C:\Server\home тут директории с сайтами

В C:\Server\Apache24\conf\ копируем/вставляем 3 копии httpd.conf и переименовываем их в httpd55.conf, httpd56.conf и httpd7.conf, каждый файл конфигурации для своей версии PHP соответственно. Я сначала сконфигурировал один конфиг апача, затем после его копипасты на 3 файла подключил в каждом файле:

свои версии PHP
#конфиг httpd55.conf
LoadModule php5_module "C:/Server/PHP55/php5apache2_4.dll"
<IfModule php5_module>
AddHandler application/x-httpd-php .php
PHPIniDir "C:/Server/PHP55"
</IfModule>

#конфиг httpd56.conf
LoadModule php5_module "C:/Server/PHP56/php5apache2_4.dll"
<IfModule php5_module>
AddHandler application/x-httpd-php .php
PHPIniDir "C:/Server/PHP56"
</IfModule>

#конфиг httpd7.conf
LoadModule php7_module "C:/Server/PHP7/php7apache2_4.dll"
<IfModule php7_module>
AddHandler application/x-httpd-php .php
PHPIniDir "C:/Server/PHP7"
</IfModule>

Далее через консоль создаем 3 сервиса Windows для каждой версии PHP, указывая какой конфиг будет использовать апач:


C:\Server\Apache24\bin\httpd.exe -k install -n "Apache PHP5.5" -f "C:\Server\Apache24\conf\httpd55.conf"
C:\Server\Apache24\bin\httpd.exe -k install -n "Apache PHP5.6" -f "C:\Server\Apache24\conf\httpd56.conf"
C:\Server\Apache24\bin\httpd.exe -k install -n "Apache PHP7" -f "C:\Server\Apache24\conf\httpd7.conf"

Не забудьте оставить автозапуск только у одной службы Апача. У меня стоит только у PHP5.6, на PHP5.5 и PHP7 переключаюсь по необходимости.

Результат:

  • можно конфигурировать каждый Apache сервер под свой PHP
  • для смены версии PHP достаточно остановить один сервер и запустить другой из ApacheMonitor

P.S. За этот костыль мне даже премию выдали :)
Поделиться с друзьями
-->

Комментарии (30)


  1. webmasterx
    10.10.2016 16:45
    +3

    Это же очевидно! Разве нет?


    1. infolex
      10.10.2016 16:57
      +1

      Именно! Только этого толком нигде не описано. Или я плохой юзер гугла? «Тысячи их», вопросов, как поставить РНР7 и оставить РНР5.*, виртуальные машины создают, доп. модули на апач ставят, зачем, если цель одна и решение очевидно?


      1. webmasterx
        10.10.2016 17:03

        простые вещи могут быть не описаны, потому что они простые и до них догадаться можно самому не найдя ответа в гугле (если туда полезли за более лучшим)


      1. saboteur_kiev
        10.10.2016 17:45
        +2

        Просто зачем создавать три сервиса apache, если вы не сможете их одновременно запустить?

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

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


        1. istui
          10.10.2016 18:51

          При этом nginx как прозрачный прокси еще и позволяет приблизить конфиги на дев-машине к боевым… (т.к. не так уж и редко используется связка nginx+httpd, кроме популярного nginx+php-fpm)


          1. vgray
            10.10.2016 19:04

            для меня оказался самым удобным способом. apache на трех разных портах, а впереди nginx. Через map очень удобно управлять какаой сайт на какую версию отправить.


  1. lnroma
    10.10.2016 17:53
    +2

    туториал как сделать 3 версии php для linux:
    1. Берём gentoo
    2. Ставим нужные версии
    3. И через eselct меняем версию

    Всё же windows для меня довольно сложная штука…


    1. saboteur_kiev
      10.10.2016 17:56
      +1

      А если у меня убунту?

      /sarkazm/ Какой же этот линукс неудобный. Захотел 3 версии PHP — надо всю систему переустанавливать.


      1. lnroma
        10.10.2016 18:07

        с убунту уже кастыли, либо 3 lxc контейнера, либо phpbrew.


        1. gvozd1989
          10.10.2016 18:30

          PHP-FPM


          1. lnroma
            10.10.2016 18:36

            да в принципе возможно если скомпилировать в разные директории, и при конфигурации указать разные директории настроек. Но сдаётся мне что демоны одновременно не запустишь а может и запустишь.


            1. wispoz
              10.10.2016 18:47

              https://www.sitepoint.com/run-multiple-versions-php-one-server/
              Если делать как здесь, все прекрасно работает.


              1. lnroma
                10.10.2016 18:50

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


      1. happyproff
        11.10.2016 08:37
        +1

        Всё просто:

        https://launchpad.net/~ondrej/+archive/ubuntu/php/ — один реп для 5.5, 5.6, 7.0, 7.1. Все версии можно установить в систему одновременно. Выбирать версию PHP для консоли можно через update-alternatives, для FPM просто разные порты, а дальше в nginx указываем порт нужного FPM.

        $ update-alternatives --config php
        There are 3 choices for the alternative php (providing /usr/bin/php).

        Selection Path Priority Status
        ------------------------------------------------------------
        0 /usr/bin/php7.1 71 auto mode
        1 /usr/bin/php5.6 56 manual mode
        2 /usr/bin/php7.0 70 manual mode
        3 /usr/bin/php7.1 71 manual mode


  1. thesun2003
    11.10.2016 09:04

    Странно, что никто не упомянул одну простую реализацию как docker контейнер. Берешь N контейнеров в котором отличается только PHP и монтируешь туда одну и ту же папку с сайтом. И вуаля — у тебя три одинаковых контейнера с различными версиями PHP.

    Накладных расходов почти никаких. Работает независимо от ОС.


  1. andrium
    11.10.2016 09:04

    Как сделано у меня:

    ./apache < — сюда распаковываем Apache HTTPd
    ./apache/conf
    ./apache/conf/http.conf < — сюда инклудим конфу PHP
    ./apache/conf/php5.conf
    ./apache/conf/php7.conf
    ./apache/conf/php.conf [символическая ссылка на необходимую версию]
    ./php53
    ./php54
    ./php55
    ./php56
    ./php70
    ./php [символическая ссылка на необходимую версию]

    Теперь пишем bat'ники…

    php56.bat

    echo off
    c:\a\apache\bin\httpd -k stop -n ApacheHTTPd
    c:\a\apache\bin\httpd -k uninstall -n ApacheHTTPd
    del c:\a\apache\conf\php.conf
    rd c:\a\php
    mklink /d c:\a\php c:\a\php56
    mklink c:\a\apache\conf\php.conf c:\a\apache\conf\php5.conf
    c:\a\apache\bin\httpd -k install -n ApacheHTTPd
    c:\a\apache\bin\httpd -k start -n ApacheHTTPd

    php70.bat

    echo off
    c:\a\apache\bin\httpd -k stop -n ApacheHTTPd
    c:\a\apache\bin\httpd -k uninstall -n ApacheHTTPd
    del c:\a\apache\conf\php.conf
    rd c:\a\php
    mklink /d c:\a\php c:\a\php70
    mklink c:\a\apache\conf\php.conf c:\a\apache\conf\php7.conf
    c:\a\apache\bin\httpd -k install -n ApacheHTTPd
    c:\a\apache\bin\httpd -k start -n ApacheHTTPd


  1. LeamasRein
    11.10.2016 09:04

    Не хочу разводить холивар, но понять не могу, у вас 250 (!) сайтов на PHP (под разными версиями??) в продакшене под Windows на апаче живут?


    1. infolex
      11.10.2016 09:07

      Нет, это девелоперская виндовая машина в офисе. Продакшены у клиентов, версия интерпретатора в ТЗ


      1. saboteur_kiev
        11.10.2016 11:45

        Чем плохо запустить несколько апачей на разных портах, которые будут смотреть в одну и туже папку с большим количеством сайтов?

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


  1. m8rge
    11.10.2016 09:04

    Наркомания. Нужно скриптик запустить на локали — любой пхп подойдет. Нужно проверить кусок кода в определенной версии — https://3v4l.org. Нужно разрабатывать проект под определенную версию — ставь докер или вагрант. И монтируй туда папку со всеми сайтиками. Версией пхп не ограничивается окружение.


    1. NLO
      11.10.2016 09:28

      НЛО прилетело и опубликовало эту надпись здесь


  1. khanid
    11.10.2016 16:42

    А вариант с IIS раз под виндой не рассматривается в принципе? Там же на каждое запущенное приложение можно повесить свой обработчик php.
    Для старых версий (на 2k3) приложения надо было руками разносить — оно предлагало дефолтное обычно, на новых — под каждый сайт — своё приложение болтается. И у каждого свой обработчик. Даже с перезапуском не придётся морочаться.
    Несмотря на то, что винду с iis хаят некоторые, это не отнимает у последнего вот таких вот преимуществ (или отсутствие подобия связки apache+nginx, nginx+php-fpm.
    А так у вас работы по перезапускам много. На апаче повесить на разные порты — вариант. В описанной мной схеме php — просто на разных доменных именах.


    1. infolex
      11.10.2016 17:51

      Я с IIS никогда не работал, но PHP на IIS? К такому жизнь меня не готовила) Для меня IIS — синоним проектов на ASP.


      1. khanid
        12.10.2016 14:10

        но PHP на IIS/blockquote>
        А почему нет? Я с iis работал только с 2003 сервера. Проблем не заметил. Всё чинно-благородно. Что было до этого — не знаю.


    1. istui
      11.10.2016 19:16

      а что со скоростью? Я слышал, что IIS иногда даже быстрее, чем апач…

      Плюс системы nginx+apache — приближенность к продакшен-окружению. Конфиг приложения пишется сразу девелопером и с минимальными правками переносится на сервер.


      1. khanid
        12.10.2016 14:08

        Скорость как скорость. Хайлоадов у меня нет, поэтому в тех масштабах не скажу. В масштабах в несколько тысяч посетителей в день (ну или одновременно посетителей 100-150 активно работающих) разницы не заметил вообще. Думаю, производительность скорее в паршивость php-кода упрётся, чем в ограничения php на винде или самого iis.
        Опять же. С точки зрения администратора мне безразлично, на чём поднимать принесённый материал. Что iis, про apache+nginx. Я честно не понимаю, какие там конфиги можно сильно выписывать на уровне вебсервера. Да, есть их n-ое количество, но так, чтобы это пораждало какую-то значительную разницу — не уверен (кроме случаев, когда некоторая платформа жёстко требует это и то (типа битрикса, да и то, с оговорками — поднимать проще на апаче, ясное дело, но никто же не воспрещает и на другие платформы смотреть)).


  1. Punk_UnDeaD
    11.10.2016 21:35

    1. infolex
      11.10.2016 21:39

      Не…


      1. Punk_UnDeaD
        11.10.2016 22:01

        Сочувствую.


  1. nikerossxp
    12.10.2016 04:30

    два года назад я уже всё расписал:
    https://habrahabr.ru/post/244117/