Назад | Перейти на главную страницу

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

Я хочу иметь возможность запускать несколько версий 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, он просто выводит необработанный файл.

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

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

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

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

Мне понравился этот краткий пошаговый обзор от 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 для конкретного каталога.