0

PHP を使用して GDBM ファイルを作成し、Apache によって参照されて基本認証を実行するシステムがあります。1999 年以来、企業ポリシーに合わせてアップグレードを行っている今まで、多くのバージョンの apache と PHP で実行されています。

コマンドラインから (適切な php.ini ファイルを指定して) php を実行すると、DBA 機能は正しく動作します。

ただし、PHP から dba_open(...) を呼び出す時点で Apache 内から呼び出されると、次のようになります。

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

マシン上のライブラリの不一致に関係していると思いますが、これ以上デバッグする方法は考えられません。どんな助けや提案も大歓迎です。

4

1 に答える 1

0

わかった。ソート!

まず、gdbm ソースをダウンロードし、ビルド/インストールしました。

次に、明示的な --with-gdbm=/usr/src/gdbm-1.11 を PHP と Apache の構成行に追加しました。

その後、新しい 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地獄」が道から外れるのを除けば、非常に役に立ちました。

とにかく、最後に 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 にリンクしていることがわかると、すべてが整理され始めました。

于 2015-08-20T06:43:33.277 に答える