我希望能够在运行 Ubuntu 12.04 的开发机上运行多个 php 版本。我想要实现的是,当我使用 localhost 作为域时,使用默认值(假设为 php 5.3.17)。当我使用 547.localhost 作为域时,使用 php 5.4.7。我看过一些使用 fastcgi 实现此功能的教程,但直到现在我还没能让它工作。我看过这些教程:
- 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/
据我所知,我已经完成了所有需要做的事情。问题是 php 根本无法运行。当我打开http://localhost/somephpfile.php
它时,它只会输出 php 文件的源代码。 也是一样http://547.localhost/somephpfile.php
。
我将详细说明我所采取的步骤,希望有人能够发现我遗漏了什么。
首先,我使用 安装了一个默认的 lamp 堆栈
sudo apt-get install lamp-server^ phpmyadmin
。此后,我有一个运行 php 存储库版本的开发服务器。然后我使用 phpfarm 创建了两个 php 安装,一个用于 5.3.17,一个用于 5.4.7。phpfarm 的本地化是
/etc/php/phpfarm
,因此可执行文件位于/etc/php/phpfarm/inst/php-{version}/bin
然后我为 apache 启用 suaxec 和 fastcgi 并禁用 mod_php
sudo a2enmod fastcgi actions suexec && sudo a2dismod php5
接下来我编辑
/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>
然后
/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
最后一步是创建虚拟主机。最后我有三个文件
/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>
最后我将 /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 运行,它只输出原始文件。
这里肯定是我遗漏了什么,但我已经经历了多次这个过程,我仍然不知道哪里出了问题。
答案1
在您的虚拟主机中,您添加了一个处理程序,但是您没有设置处理程序,这就是它未被处理的原因。添加:
<FilesMatch "\.php$">
SetHandler php-cgi
</FilesMatch>
</Directory>
在每个虚拟主机文件之前。
答案2
我喜欢这个简短的分步概述看DoubleYou并想亲自尝试一下。缺少的是
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 模块,必须先安装它们
- 文件
FastCgiWrapper /usr/lib/apache2/suexec
中的行需要 suexec 可执行文件fastcgi.conf
- 我还必须删除该行
FastCgiIpcDir /var/lib/apache2/fastcgi
- 否则我会收到错误消息
FastCgiIpcDir /var/lib/apache2/fastcgi: already defined as "/var/lib/apache2/fastcgi"
- 否则我会收到错误消息
对于任何试图通过 .htaccess 或 vhosts 文件设置 php_admin_value 和 php_value 的人:这在 FCGI 中是不可能的。相反,你可以使用.user.ini 文件设置目录特定的 php.ini 配置。