Мой сервер — centos7, мне удалось установить на нем apache, php7.1, oracle-instantclient18.3-basic и oci8. OCI8 теперь работает нормально, когда я запускаю код на CLI, он подключается к базе данных и получает данные, только с одним предупреждением (также появляется при запуске php -v):
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/pdo_oci.so' - /usr/lib64/php/modules/pdo_oci.so: undefined symbol: php_pdo_unregister_driver in Unknown on line 0
в отличие от того, когда я открываю страницу через браузер (на клиентском компьютере), я получаю эту ошибку:
Fatal error: Uncaught Error: Call to undefined function oci_connect() in /var/www/html/pcmapi/emp.php:5 Stack trace: #0 {main} thrown in /var/www/html/pcmapi/emp.php on line 5
phpinfo () возвращает:
oci8
OCI8 Support => enabled
OCI8 DTrace Support => enabled
OCI8 Version => 2.1.8
Oracle Run-time Client Library Version => 18.3.0.0.0
Oracle Compile-time Instant Client Version => 18.3
Directive => Local Value => Master Value
oci8.connection_class => no value => no value
oci8.default_prefetch => 100 => 100
oci8.events => Off => Off
oci8.max_persistent => -1 => -1
oci8.old_oci_close_semantics => Off => Off
oci8.persistent_timeout => -1 => -1
oci8.ping_interval => 60 => 60
oci8.privileged_connect => Off => Off
oci8.statement_cache_size => 20 => 20
На самом деле я не могу понять, что является причиной фатальной ошибки, будь то в конфигурации Apache или OCI, и я нахожу странным, что функции OCI работают нормально на Cli, но не Apache. любая помощь?
Решение состоит в том, чтобы убедиться, что вы загружаете pdo.so
перед загрузкой pdo_oci.so
,
Я не знаю точную конфигурацию, которую вы используете, но на Ubuntu, например, у меня есть pdo_mysql.so
загрузка после pdo.so
имея эти файлы конфигурации в PHP conf.d
:
10-pdo.ini:
extension=pdo.so
20-PDO-mysql.ini:
extension=pdo_mysql.so
Обратите внимание, что файл 10-pdo.ini
будет загружаться раньше, чем 20-pdo-mysql.ini
просто из-за его имени файла.
Удачи.
Общая проблема заключается в том, что Apache не имеет клиентских библиотек Oracle (например, Instant Client) в своем пути поиска библиотек. Причина, по которой PHP работает в командной строке, заключается в том, что ваша оболочка делает правильно задать путь поиска в библиотеке.
Если у вас нет других библиотек Oracle на этом компьютере, выполните:
sudo sh -c "echo /usr/lib/oracle/18.3/client64/lib > /etc/ld.so.conf.d/oracle-instantclient.conf"sudo ldconfig
Если у вас есть другое программное обеспечение, которое может конфликтовать, то сделайте что-то вроде редактирования /etc/sysconfig/httpd
и добавить:
LD_LIBRARY_PATH=/usr/lib/oracle/18.3/client64/lib
В зависимости от вашей версии Apache, то, как вы устанавливаете среду, меняется (ууу!)
Вы можете или не должны экспортировать это:
export LD_LIBRARY_PATH=/usr/lib/oracle/18.3/client64/lib
В других системах вы можете использовать файл Apaches envvars.
Спасибо за ваше время, я на самом деле переустановил всю среду снова, это было болезненно, так как это рабочий сервер, но окупился.
пока у меня был mysql & InstantClient уже настроен, я удалил php & Затем httpd переустановите их все следующим образом:
yum install httpd php php-mysql php-devel php-oci8 php-pear mod_ssl
а потом:
service httpd restart
сейчас это работает.