在Apache上以 DSO 方式安装 PHP

发表于:2007-06-08来源:作者:点击数: 标签:
如果以静态方式安装Apache ,则每次 PHP 有升级后,就必须重新安装 Apache,所以,在实践当中,笔者总是建议用户以 DSO 方式来安装 PHP。如果需要安装 ApacheSSL 时,你就更会感觉到DSO 的方便和快捷了。 DSO 字面的含义就是动态共享对象,详细的文档可以参考
如果以静态方式安装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 = 'gclearcase/" target="_blank" >cc';
  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 了。


原文转自:http://www.ltesting.net