Múltiplas versões php simultaneamente no Ubuntu

16

Eu quero ser capaz de rodar várias versões php na minha caixa de desenvolvimento rodando o Ubuntu 12.04. O que eu quero realizar é que quando eu uso localhost como domínio, um padrão é usado (digamos php 5.3.17). Quando eu uso 547.localhost como domínio php 5.4.7 é usado. Eu 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. link
  2. link

Por tanto quanto posso ver, fiz tudo o que é necessário. O problema é que o php simplesmente não roda. Quando eu vou para http://localhost/somephpfile.php ele apenas mostra a origem do arquivo php. O mesmo para http://547.localhost/somephpfile.php .

Eu vou detalhar os passos que tomei na esperança de que alguém seja capaz de 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, tive um servidor de desenvolvimento em funcionamento executando a versão do repositório do php.
  2. Então eu usei o phpfarm para criar duas instalações do php, uma para o 5.3.17 e outra para o 5.4.7. A localização do phpfarm é /etc/php/phpfarm , portanto, os executáveis estão em /etc/php/phpfarm/inst/php-{version}/bin
  3. Então eu ative suaxec e fastcgi para o apache e disabe mod_php com sudo a2enmod fastcgi actions suexec && sudo a2dismod php5
  4. Em seguida, editei /etc/apache2/mods-enabled/fastcgi.conf para 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. Em seguida, em /var/www/ criei uma pasta cgi-bin e nesta pasta dois arquivos, para cada uma das duas versões do php da seguinte forma (mostro apenas a de 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, eu 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. Por fim, alterei 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 esperaria que as coisas funcionassem, mas infelizmente elas não funcionam. Em vez disso, os arquivos php são executados através do php, apenas mostra o arquivo bruto.

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

    
por SeeDoubleYou 25.09.2012 / 13:35

2 respostas

2

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

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

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

    
por 28.09.2012 / 16:21
0

Gostei desta breve descrição geral passo-a-passo por SeeDoubleYou e quis experimentar pessoalmente. O que faltava era

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

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 php.ini específico do diretório configurações.

    
por 06.08.2017 / 11:48