У меня есть система, которая использует PHP для создания файла GDBM, на который затем ссылается Apache для выполнения базовой аутентификации. Он работает с 1999 года со многими версиями apache и PHP и до сих пор, когда я делаю обновление в соответствии с корпоративной политикой.
Если я запускаю php из командной строки (указывая соответствующий файл php.ini), то функциональность DBA работает правильно.
Однако, когда он вызывается из Apache в тот момент, когда он вызывает dba_open (…) из PHP, я получаю:
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
но теперь, когда ему удалось перестроить файл данных GDBM с помощью командной строки PHP, он работает правильно — следовательно, кажется, что могут быть (или были) проблемы с кодировкой символов или что-то подобное
Внутри 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
Я предполагаю, что это должно быть связано с несовпадением библиотек на машине, но я не могу придумать больше способов отладки. Любая помощь или предложения будут высоко оценены.
ХОРОШО. сортируется!
Сначала я скачал исходный код gdbm и собрал / установил его.
Затем я добавил в строки настройки PHP и Apache явный —with-gdbm = / usr / src / gdbm-1.11.
Затем я заметил, что новый gdbm установил сам / usr / local / lib, но этого не было в моем пути поиска в ld.so.conf. Поэтому я скопировал файлы и создал правильные ссылки (.so.4 и т. Д.) В / usr / lib64.
Наконец, моя проблема, связанная с тем, что он работал из командной строки, была связана с правами доступа — поскольку после создания версии из командной строки у него больше не было владения apache, необходимого для открытия внутри apache. Для тех, кто следит за конкретной ошибкой, которую вы видите для dba_open ():
dba_open(...): Driver initialization failed for handler: gdbm: File open error
что, конечно, было бы весьма полезно, кроме всего прочего «дьявольского ада», выбрасывающего вещи со следа.
Во всяком случае, в конце концов решение игры с использованием 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, все начало самообладываться.
Других решений пока нет …