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

16

Я хочу иметь возможность запускать несколько версий php на своем компьютере для разработки под управлением Ubuntu 12.04. Что я хочу сделать, так это то, что когда я использую localhost в качестве домена, используется значение по умолчанию (скажем, php 5.3.17). Когда я использую 547.localhost в качестве домена используется php 5.4.7. Я видел некоторые учебники, чтобы заставить это работать с помощью fastcgi, но до сих пор я не смог заставить его работать. Я посмотрел на эти уроки:

  1. http://dbforch.wordpress.com/2010/05/21/apache2-fastcgi-multiple-php-versions-ubuntulucid-10-04/
  2. http://www.metod.si/multiple-php-versions-with-apache-2-fastcgi-phpfarm-on-ubuntu/

Насколько я вижу, я сделал все, что нужно. Проблема в том, что php просто не запускается. Когда я иду на http://localhost/somephpfile.phpэто просто выводит источник файла php. То же самое для http://547.localhost/somephpfile.php.

Я разобью, какие шаги я предпринял, в надежде, что кто-то сможет определить, что я пропустил.

  1. Сначала я установил стек ламп по умолчанию, используя sudo apt-get install lamp-server^ phpmyadmin. После этого у меня был рабочий сервер разработки, на котором работала репозитарий версии php.
  2. Затем я использовал phpfarm для создания двух установок php, одна для 5.3.17 и одна для 5.4.7. Местонахождение phpfarm есть /etc/php/phpfarm, поэтому исполняемые файлы находятся в/etc/php/phpfarm/inst/php-{version}/bin
  3. Затем я включаю suaxec и fastcgi для apache и отключаю mod_php с помощью sudo a2enmod fastcgi actions suexec && sudo a2dismod php5
  4. Далее я отредактировал, /etc/apache2/mods-enabled/fastcgi.confчтобы прочитать:

    <IfModule mod_fastcgi.c>   
        FastCgiIpcDir /var/lib/apache2/fastcgi  
        FastCgiWrapper /usr/lib/apache2/suexec   FastCgiConfig -idle-timeout
        110 -killInterval 120 -pass-header HTTP_AUTHORIZATION -autoUpdate  
        ScriptAlias /php-fcgi/ /var/www/cgi-bin/ 
    </IfModule>
    
  5. Затем /var/www/я создал папку cgi-bin и в этой папке два файла для каждой из двух версий php следующим образом (я показываю только один для 5.3.17 /var/www/php5317.fcgi):

    #!/bin/sh
    # you can change the PHP version here.
    version="5.3.17"
    # php.ini file location, */php-5.2.13/lib equals */php-5.2.13/lib/php.ini.
    PHPRC=/etc/php/phpfarm/inst/php-${version}/lib/php.ini
    export PHPRC
    
    PHP_FCGI_CHILDREN=3
    export PHP_FCGI_CHILDREN
    
    PHP_FCGI_MAX_REQUESTS=5000
    export PHP_FCGI_MAX_REQUESTS
    
    # which php-cgi binary to execute
    exec /etc/php/phpfarm/inst/php-${version}/bin/php-cgi
    
  6. Последним шагом было создание виртуальных хостов. В итоге у меня есть три файла /etc/apache2/sites-enabled: 000-default, php5.3.17 и php5.4.7 со следующим содержимым:

    дефолт:

    <VirtualHost *:80>
      ServerName localhost
      DocumentRoot /var/www
      <Directory "/var/www">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
        AddHandler php-cgi .php
        Action php-cgi /php-fcgi/php5317.fcgi
      </Directory>
    </VirtualHost>
    

    php5.3.17:

    <VirtualHost *:80>
      ServerName 5317.localhost
      DocumentRoot /var/www
      <Directory "/var/www">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
        AddHandler php-cgi .php
        Action php-cgi /php-fcgi/php5317.fcgi
      </Directory>
    </VirtualHost>
    

    php5.4.7:

    <VirtualHost *:80>
      ServerName 547.localhost
      DocumentRoot /var/www
      <Directory "/var/www">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
        AddHandler php-cgi .php
        Action php-cgi /php-fcgi/php547.fcgi
      </Directory>
    </VirtualHost>
    
  7. Наконец я изменил / etc / hosts на чтение

    127.0.0.1   localhost
    127.0.0.1   547.localhost
    127.0.0.1   5317.localhost
    
    # The following lines are desirable for IPv6 capable hosts
    ::1     ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    

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

Должно быть, что-то здесь я пропустил, но я много раз проходил этот процесс и не могу понять, где он идет не так.

SeeDoubleYou
источник
Одна вещь, с которой я столкнулся, заключалась в том, что если бы я назвал файлы cgi, как вы, это не сработало. Попробуйте переименовать /var/www/cgi-bin/php-cgi-5.4.7в /var/www/cgi-bin/php54.fcgi, например , или просто /var/www/cgi-bin/php.fcgi. Можете ли вы проверить, помогает ли это? Просто для версии 5.4.7.
Я проверил, и, к сожалению, это не помогает. Я изменил VirtualHost , чтобы отразить эти изменения, а поэтому линия действия чтенияAction php-cgi /php-fcgi/php547.fcgi
Я обновил пост, чтобы отразить эти изменения, так как я думаю, что в любом случае хорошо иметь его таким
Хм, тогда я проверю другие возможности. :)
Мне было интересно, возможно, мне не нужны вещи suexec, так как мне не нужны разные пользователи для каждой версии php, верно?

Ответы:

2

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

<FilesMatch "\.php$">
    SetHandler php-cgi
</FilesMatch>

перед </Directory>в каждом файле виртуальных хостов.

user138869
источник
0

Мне понравился этот краткий пошаговый обзор от SeeDoubleYou, и я хотел попробовать его сам. Чего не хватало было

  • sudo chmod +x /var/www/cgi-bin/*
    • Поскольку это не было выполнено, apache не смог выполнить сценарии cgi
    • Это нужно для строки Action php-cgi /php-fcgi/php<version>.fcgi в vhost.confфайле
  • sudo apt-get install apache2-suexec-pristine libapache2-mod-fastcgi
    • Исполняемый файл suexec и модуль fastcgi отсутствовали, их нужно было сначала установить
    • Исполняемый файл suexec необходим для строки FastCgiWrapper /usr/lib/apache2/suexecв fastcgi.confфайле
  • Я также должен был удалить линию FastCgiIpcDir /var/lib/apache2/fastcgi
    • в противном случае я получил сообщение об ошибке FastCgiIpcDir /var/lib/apache2/fastcgi: already defined as "/var/lib/apache2/fastcgi"

Для тех, кто пытается установить php_admin_value и php_value через файлы .htaccess или vhosts: это невозможно с FCGI. Вместо этого вы можете использовать файлы .user.ini для установки определенных каталогов конфигураций php.ini.

Elektropepi
источник