我在这台服务器上运行的是 Ubuntu 8.04。我通过包管理器安装了 PHP 5.2。我删除了它,然后手动安装 PHP 5.3.1。我像这样构建了包
./configure --prefix=/opt/php --with-mysql --with-curl=/usr/bin --with-apxs2=/usr/bin/apxs2
make
make install
这在 /opt/php/ 中安装了 PHP 5.3.1
$ php -v
PHP 5.3.1 (cli) (built: Dec 7 2009 10:51:14)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies
但是,当我尝试启动 Apache 时出现了这个问题。
# /etc/init.d/apache2 restart
* Restarting web server apache2
apache2: Syntax error on line 185 of /etc/apache2/apache2.conf:
Syntax error on line 1 of /etc/apache2/mods-enabled/php5.load:
Cannot load /usr/lib/apache2/modules/libphp5.so into server:
/usr/lib/apache2/modules/libphp5.so: undefined symbol: OnUpdateLong
[fail]
知道是什么导致了这个错误吗?我看到的所有参考资料都与为 php4 或类似程序构建 php5 包有关。这台机器上从未安装过 PHP4。
答案1
事实上,詹姆斯哈克特 (James Hackett) 所说的内容对我而言或多或少是有用的。
我的问题是我构建了 PHP前我安装了 Apache(我从最新的主干构建了 PHP 并通过 APT 安装了 Apache2)。
因此,当我遇到 apache 遇到未定义符号的错误(未找到的模块是任意的)时,我执行了以下操作:
make distclean
在 php 源代码上./configure --prefix=/usr/local/php-5.3-svn --with-apxs2=/usr/bin/apxs2
make && make install
一切运行正常。
显然,Captain 在躲着我,当然,因为如果你只是重新制作而不使用 make distclean && configure,make 只会编译新的符号,这显然是不够的 ;-)
答案2
我遇到了同样的问题,我所做的就是删除我的 php 源目录,重新提取 tarball,然后再次编译,一切正常。
我之前曾在该系统上安装了没有 apache 的 php,然后我尝试从同一个源目录使用不同的配置设置重新安装 php。
答案3
您构建了 php5,但您没有重建 apache 和 php5 之间的粘合。由于您使用的是 mod_php5,因此它会失败(合乎逻辑)。
您可能能够通过 fastcgi 运行 php 脚本(我假设您手动构建的 php 5.3.1 没问题),但无论如何,我建议您采取其他方式。
在生产服务器上手动构建软件非常麻烦。此外,PHP5 是一个很大的软件,你真的应该不是出于维护和安全目的这样做。
如果您确实需要该版本,那么实现此目的的正确方法是反向移植该软件包。(是的,打包!)
它需要一些打包知识和时间。您可以使用以下方式获取打包源:apt-get source php5
,前提是您在 /etc/apt/sources.list 中有一个 deb-src 源
答案4
正如 @zecrazytux 所指出的,您是否安装了适当的 apache-dev 包?即使您告诉了它们的位置,PHP 也可能没有它们而构建。您需要查看 ./configure 输出。