我有一个使用PHP构建GDBM文件的系统,然后由Apache引用该文件来执行基本身份验证。它自1999年以来一直运行着许多版本的apache和PHP,直到现在我正在进行升级以匹配公司策略。
如果我从命令行运行php(指定相应的php.ini文件),那么DBA功能可以正常工作。
然而,当从Apache内部调用它从PHP调用dba_open(...)时,我得到:
Warning: dba_open(/etc/httpd/conf/users.tmp,n): Driver initialization failed for handler: gdbm: File open error in /var/www/phpinc/bxxx.inc
PHP是使用以下命令构建的:
./configure --with-iconv --with-mysql --with-mysql-sock=/var/run/mysql/mysql.sock --with-apxs2=/usr/local/apache2/bin/apxs --with-gdbm --enable-mbstring --with-gd --enable-dba
我只根据其他一些评论添加了--enable-dba。
gdbm_dump失败并报告:
gdbm_dump: gdbm_open failed: Unexpected end of file
但现在已经设法使用命令行PHP重建GDBM数据文件它可以正常工作 - 因此似乎可能(或者是)字符编码问题或类似的东西
在Apache内部,它失败了:
[authn_dbm:error] [pid 14104:tid 140279619360512] (20014)Internal error (specific information not available): [client 10.160.9.247:52710] AH01754: could not open dbm (type GDBM) auth file: /etc/httpd/conf/users, referer: xxxxx
我假设它必须与机器上的库不匹配有关,但我想不出更多的方法来调试它。任何帮助或建议将不胜感激。
答案 0 :(得分:0)
行。排序!
首先我下载了gdbm源并构建/安装了它。
然后我添加到PHP和Apache配置行显式--with-gdbm = / usr / src / gdbm-1.11。
然后我注意到新的gdbm已经安装了自己的/ usr / local / lib,但这不在ld.so.conf中的搜索路径中。所以我复制了文件并在/ usr / lib64中创建了正确的链接(.so.4等)。
最后我在命令行上使用它的问题是权限相关 - 因为从命令行创建了一个版本,它不再需要在apache中打开所需的apache所有权。对于那些关注dba_open()的特定错误的人是:
dba_open(...): Driver initialization failed for handler: gdbm: File open error
当然除了所有其他的“dll hell”抛弃一些东西之外,这当然会非常有用。
无论如何最终解决方案游戏从使用ldd来看:
/usr/local/bin/php
/usr/local/apache2/bin/httpd
/usr/local/apache2/lib/libapr-1.so.0
/usr/local/apache2/lib/libaprutil-1.so.0
/usr/local/apache2/modules/libphp5.so
一旦我看到它们链接到不同版本的libgdbm,它就开始自行解决。