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:
- http://dbforch.wordpress.com/2010/05/21/apache2-fastcgi-multiple-php-versions-ubuntulucid-10-04/
- 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.php
ele 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.
- 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. - 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
- Então eu habilito suaxec e fastcgi para apache e disabe mod_php com
sudo a2enmod fastcgi actions suexec && sudo a2dismod php5
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>
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
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>
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.
/var/www/cgi-bin/php-cgi-5.4.7
para,/var/www/cgi-bin/php54.fcgi
por exemplo, ou apenas/var/www/cgi-bin/php.fcgi
. Você pode verificar se isso ajuda? Apenas para a versão 5.4.7.Action php-cgi /php-fcgi/php547.fcgi
Respostas:
Nos virtualhosts, você adicionou um manipulador, mas não o definiu, e é por isso que não é processado. Adicionar:
antes
</Directory>
em cada arquivo de hosts virtuais.fonte
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/*
Action php-cgi /php-fcgi/php<version>.fcgi
novhost.conf
arquivosudo apt-get install apache2-suexec-pristine libapache2-mod-fastcgi
FastCgiWrapper /usr/lib/apache2/suexec
nofastcgi.conf
arquivoFastCgiIpcDir /var/lib/apache2/fastcgi
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.
fonte