因为我们正处于ZendFramework2.0开发的全过程中,我发现我的系统中有各种来自PHP5.2和5.3版本系列的PHP二进制文件。我们现在正处于我想要测试将应用程序从ZF1.X迁移到2.0的阶段,以了解哪些有效,哪些无效。但这意味着我需要在我的服务器上启用多个PHP二进制文件……
我在我的开发箱上使用ZendServer;它很容易安装,并使用我的本机Ubuntu更新管理器来获取更新。在Ubuntu上,它安装DebianApache2包,所以我得到了额外的好处,那就是熟悉配置结构。
我前段时间安装了ZendServer,所以我仍然使用PHP5.2mod_php
二进制文件。我已经在本地编译和安装了几个PHP5.3二进制文件,用于运行单元测试和示例脚本——所以问题是如何让我的5.2mod_php
运行,同时允许在5.3中运行选定的虚拟主机?
答案可以用一个首字母缩略词来概括:FastCGI。
在RalphSchindler的帮助下,我完成了设置。
在Ubuntu的Apache上启用FastCGI
有趣的是,默认情况下FastCGI未启用,您需要的另一个模块mod_actions
也未启用。不过,您可以非常轻松地启用这些功能:
$ cd /etc/apache2/mods-enabled $ sudo ln -s ../mods-available/fastcgi.load . $ sudo ln -s ../mods-available/fastcgi.conf . $ sudo ln -s ../mods-available/actions.load . $ sudo ln -s ../mods-available/actions.conf .
创建一个支持FastCGI的虚拟主机
接下来,您需要添加一个将使用FastCGI的新虚拟主机。我复制了一个存在于我的/etc/apache2/sites-enabled
树中的虚拟主机,修改它以赋予它一个唯一的ServerName
和DocumentRoot
,并且添加了以下几行:
ScriptAlias /cgi-bin/ /path/to/zfproject/public/cgi-bin/ AddHandler php-fcgi .php Action php-fcgi /cgi-bin/php-5.3.1
PHP脚本的名称无关紧要;我使用了“php-5.3.1”,这样我就可以直观地识别我在该虚拟主机上使用的PHP版本。
创建“cgi-bin”目录和CGI脚本
最后,我需要实际创建“cgi-bin”目录和要执行的CGI脚本。这相对简单;我导航到我项目的DocumentRoot
,并创建了一个新目录cgi-bin
(mkdircgi-bin
)。
然后我进入该目录并根据我在虚拟主机中提供的名称创建了一个新脚本。该脚本cgi-bin/php-5.3.1
然后只是exec
来自我的PHP安装的php-cgi
二进制文件。
关于CGI二进制文件的注意事项
在PHP5.3及更高版本中,CGI二进制文件是默认构建的—并且它们已经启用了FastCGI。在PHP5.2中,CGI版本仍然是默认构建的,但除非您显式传递--enable-fastcgi
配置标志,否则它们不会启用FastCGI。要确定您在编译时是否这样做,请执行以下操作:
$ php-cgi -i | grep fcgi
如果没有输出,则需要重新编译。
我的脚本是这样的:
#!/bin/bash exec /path/to/php/install/bin/php-cgi "$@"
因为这是一个CGI二进制文件,您可以传递额外的CLI参数和环境变量;尝试设置您的include_path
、应用程序环境等。
创建完脚本后,确保它是可执行的:
$ chmod a+x php-5.3.1
启动它!
完成上述操作后,我重新启动了Apache实例(sudo/etc/init.d/apache2restart
)。在确保没有启动错误后,我导航到我的新虚拟主机,瞧!它正在运行。
对于那些第一次接触PHP5.3的人来说,这是一种无需运行单独的服务器即可测试代码的绝佳方法。这也是测试您的应用程序是否支持5.3的好方法—创建一个支持5.3的虚拟主机,指向您现有的应用程序并查看它是否运行。