Várias versões php simultaneamente no Ubuntu

16

Eu quero ser capaz de executar várias versões php na minha caixa de desenvolvimento executando o Ubuntu 12.04. O que eu quero realizar é que, quando eu uso o host local como domínio, é usado um padrão (digamos, php 5.3.17). Quando eu uso 547.localhost como domínio, o php 5.4.7 é usado. Eu já vi alguns tutoriais para fazer isso funcionar usando o fastcgi, mas até agora não consegui fazê-lo funcionar. Eu olhei para estes tutoriais:

  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/

Pelo que pude ver, fiz tudo o que é necessário. O problema é que o php simplesmente não roda. Quando eu vou para http://localhost/somephpfile.phpele apenas gera a fonte do arquivo php. O mesmo para http://547.localhost/somephpfile.php.

Vou detalhar os passos que dei na esperança de que alguém consiga identificar o que eu perdi.

  1. Primeiro instalei uma pilha de lâmpadas padrão usando sudo apt-get install lamp-server^ phpmyadmin. Depois disso, eu tive um servidor de desenvolvimento funcionando executando a versão do repositório do php.
  2. Então eu usei o phpfarm para criar duas instalações de php, uma para 5.3.17 e outra para 5.4.7. A localização do phpfarm é /etc/php/phpfarm, então os executáveis ​​estão em/etc/php/phpfarm/inst/php-{version}/bin
  3. Então eu habilito suaxec e fastcgi para apache e disabe mod_php com sudo a2enmod fastcgi actions suexec && sudo a2dismod php5
  4. Em seguida, editei /etc/apache2/mods-enabled/fastcgi.confpara ler:

    <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. Então, /var/www/eu criei uma pasta cgi-bin e nessa pasta dois arquivos, para cada uma das duas versões php da seguinte maneira (mostro apenas a versão 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. O último passo foi criar hosts virtuais. No final, tenho três arquivos em /etc/apache2/sites-enabled: 000-default, php5.3.17 e php5.4.7 Com o seguinte conteúdo:

    padrão:

    <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. Finalmente mudei o / etc / hosts para ler

    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
    

Agora eu esperava que as coisas funcionassem, mas infelizmente elas não. Em vez disso, um arquivo php é executado no php, apenas gera o arquivo bruto.

Deve haver algo que eu perdi aqui, mas já passei pelo processo várias vezes e não consigo descobrir onde isso dá errado.

SeeDoubleYou
fonte
Uma coisa que encontrei foi que, se eu nomeasse os arquivos cgi como você, ele não funcionaria. Tente renomear /var/www/cgi-bin/php-cgi-5.4.7para, /var/www/cgi-bin/php54.fcgipor exemplo, ou apenas /var/www/cgi-bin/php.fcgi. Você pode verificar se isso ajuda? Apenas para a versão 5.4.7.
Eu verifiquei e infelizmente isso não ajuda. Eu mudei o virtualhost para reflectir esta alteração, bem como para a linha de acção lerAction php-cgi /php-fcgi/php547.fcgi
Eu atualizei o post para refletir essas alterações desde que eu acho que é bom tê-lo assim mesmo
Hmm, vou procurar outras possibilidades então. :)
Eu estava pensando, provavelmente não preciso do material suexec, pois não preciso de usuários diferentes para cada versão php, certo?

Respostas:

2

Nos virtualhosts, você adicionou um manipulador, mas não o definiu, e é por isso que não é processado. Adicionar:

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

antes </Directory>em cada arquivo de hosts virtuais.

user138869
fonte
0

Gostei dessa breve visão geral passo a passo da SeeDoubleYou e queria experimentar por conta própria. O que estava faltando era

  • sudo chmod +x /var/www/cgi-bin/*
    • Como isso não foi executado, o apache não foi capaz de executar os scripts cgi
    • Isso é necessário para a linha Action php-cgi /php-fcgi/php<version>.fcgi no vhost.confarquivo
  • sudo apt-get install apache2-suexec-pristine libapache2-mod-fastcgi
    • módulo executável suexec e fastcgi estavam ausentes, eles precisavam ser instalados primeiro
    • O executável suexec é necessário para a linha FastCgiWrapper /usr/lib/apache2/suexecno fastcgi.confarquivo
  • Eu também tive que remover a linha FastCgiIpcDir /var/lib/apache2/fastcgi
    • caso contrário, recebi a mensagem de erro FastCgiIpcDir /var/lib/apache2/fastcgi: already defined as "/var/lib/apache2/fastcgi"

Para quem está tentando definir php_admin_value e php_value via arquivos .htaccess ou vhosts: isso não é possível com o FCGI. Em vez disso, você pode usar arquivos .user.ini para definir configurações específicas do diretório php.ini.

Elektropepi
fonte