Достаточно часто встречается связка Nginx + PHP-FPM, которая заменяет собой привычный многим Apache + mod_php. А когда требуется добавить возможность работать с Oracle из PHP, то не подготовленный человек, а точнее привычный к настройке Oracle Client для PHP, работающего как модуль Apache, может столкнуться с непредвиденными проблемами, о решении которых я попробую рассказать.
Итак, у нас CentOS (в принципе на других Linux все будет аналогично) на который уже установлен Nginx, PHP, PHP-FPM и Oarcle Client + модуль php_oci8. На всякий случай, в этом можно убедиться командой:
# php -m | grep oci
Если вывод такой же, как в примере ниже, то модуль установлен:
# php -m | grep oci
oci8
А вот если, там ругань об отсутствующей библиотеке вроде:
PHP Startup: Unable to load dynamic library 'oci8.so' (tried: /usr/lib/php/20170718/oci8.so (libmql1.so: cannot open shared object file: No such file or directory), /usr/lib/php/20170718/oci8.so.so (/usr/lib/php/20170718/oci8.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
То надо сделать (замените путь из примера на свой):
# echo /u01/app/oracle/product/12.1.02/db_1/lib > /etc/ld.so.conf.d/oracle.conf # ldconfig
* в случае Oracle Instant Client путь будет до папки клиента, например /opt/oracle/instantclient_12_2
.
Теперь модуль должен нормально заработать в консольном режиме.
Но после этого все равно при попытке использовать oci_connect(...) получаем вот такую ошибку в ответе от сервера:
Warning: oci_connect(): OCIEnvNlsCreate() failed. There is something wrong with your system - please check that ORACLE_HOME and LD_LIBRARY_PATH are set and point to the right directories in /var/www/...
Когда все известные бубны с прописыванием ORACLE_HOME и LD_LIBRARY_PATH во все скрипты запуска и прочие перебраны, но все равно не работает, то простое решение кажется просто невозможным, но оно есть!
Разработчики PHP-FPM позаботились о нас и сделали прекрасный конфиг, которым как раз и надо пользоваться.
Идем в /etc/php-fpm.d/www.conf
(если такого нет то смотрим в /etc/php-fpm.conf
откуда берутся конфиги или работаем непосредственно с ним).
Находим место где написано примерно вот это:
; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from
; the current environment.
; Default Value: clean env
;env[HOSTNAME] = $HOSTNAME
;env[PATH] = /usr/local/bin:/usr/bin:/bin
;env[TMP] = /tmp
;env[TMPDIR] = /tmp
;env[TEMP] = /tmp
И ниже дописываем, естественно заменяя пути из примера ниже на свои:
env[ORACLE_HOME] = /u01/app/oracle/product/12.1.02/db_1
env[LD_LIBRARY_PATH] = $ORACLE_HOME/lib:$LD_LIBRARY_PATH
env[TNS_ADMIN] = /u01/app/oracle/product/12.1.02/db_1/network/admin/
env[PATH] = $PATH:$HOME/bin:$ORACLE_HOME/bin
* в случае Oracle Instant Client пути будут до папки клиента, например /opt/oracle/instantclient_12_2
.
Теперь перезапускаем PHP-FPM:
service php-fpm restart
И наступает долгожданное чудо - успешный коннект к Oracle.