2016-09-02 15:12:03

Oracle Client вместе с PHP-FPM

PHP Oracle Linux

PHP-FPM

Достаточно часто встречается связка 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.