如果以静态方式安装Apache,则每次PHP有升级后,就必须重新安装Apache,所以,在实践当中,笔者总是建议用户以DSO方式来安装PHP。如果需要安装ApacheSSL时,你就更会感觉到DSO的方便和快捷了。
DSO字面的含义就是动态共享对象,详细的文档可以参考Apache的在线手册。在使用DSO之前,你必须保证自己的Apache能支持DSO,因此,在编译PHP时,应该使用--with-apxs=/usr/local/apache/apxs的参数,当然这里的apxs所在的路径需要根据你自己的安装路径来修改。
有可能你会遇到下面的错误报告:
configure: error: Sorry, I cannot run apxs. Either you need to install Perl or you need to pass the absolute path of apxs by using --with-apxs=/absolute/path/to/apxs
如果碰到这样的问题,一般是Perl已经安装并且已经指定了apxs的路径,但是Apache不支持mod_so。Apache的缺省编译是支持mod_so的,除非你在编译时使用了--disable-module=so参数。
最常见的问题就是在运行了“#./configure --with-apxs=/usr/local/apache/apxs”之后看到下面的错误报告:
WARNING: Your /usr/local/apache/bin/apxs script is most likely broken.
所以,我们有必要检查一下apxs这个脚本文件。在文件中查看下面的行:
my $CFG_CFLAGS_SHLIB = ;
my $CFG_LD_SHLIB = ;
my $CFG_LDFLAGS_SHLIB = ;
如果以上几行真是空的话,那么apxs就真的有问题了。正确的应该是:
my $CFG_CFLAGS_SHLIB = -fpic -DSHARED_MODULE;
my $CFG_LD_SHLIB = gcc;
my $CFG_LDFLAGS_SHLIB = q(-shared);
Red Hat的6.1和6.2中的apxs也有问题,下面的行:
my $CFG_LIBEXECDIR = modules;
应该修改为:
my $CFG_LIBEXECDIR = /usr/lib/apache;
得到正确的apxs后,就可以编译PHP了。 经过make和make install,并且重启Apache后,我们又得到了一个错误消息:
API module structure `php4_module in file /usr/local/apache/libexec/libphp4.so is garbled - perhaps this is not an Apache module DSO?
不要担心,我从来就没有碰到过这样的消息!因为我在开始新的编译之前总是使用make clean ; make distclean来清除以前编译后留下的“垃圾”。
但是需要指出的是,笔者在升级PHP 4.0.4pl1过程中,碰到的问题是在编译完毕,并重新启动Apache之后碰到“undefined symbol:uncompressed” 的报告。经过多次调试发现是采用了“--with-mysql=/usr/local/mysql”的开关所致,后来采用MySQL源代码版本,重新编译MySQL以后,再编译PHP,就没有这个问题了。所以,应该是MySQL的库没有进入编译路径所致。
需要注意的是,编译Apache的时候,不要使用“--activate-module=src/modules/php4/libphp4.a”参数,因为这样的话,PHP4就是以静态方式来安装了。
恭喜你,安装成功,以后PHP有新的补丁/版本出来,就不需要重新编译Apache了。