Ошибка мгновенного клиента Oracle DYLD_LIBRARY_PATH
Я использую Xamppp для macos на OSX 10.9 с Php 5.4.19. Я установил oracle instantclient и вижу, что oci8 включен в phpinfo (ниже):
Поддержка OCI8 включена Версия 1.4.9 Revision $Id: 44bfa713983a99b3e59477f6532e5fb51b6dee94 $ Активные постоянные соединения 0 Активные соединения 0
я могу видеть DYLD_LIBRARY_PATH
установлен в моем phpinfo также.
DYLD_LIBRARY_PATH /usr/local/instantclient/11.2.0.3
Но когда я пытаюсь соединиться с php, я получаю ту же ошибку в течение двух дней:(
Предупреждение: oci_connect(): сбой OCIEnvNlsCreate(). Что-то не так с вашей системой - пожалуйста, убедитесь, что DYLD_LIBRARY_PATH включает в себя каталог с библиотеками Oracle Instant Client в info.php в строке 6 Предупреждение: oci_connect(): ошибка при попытке получить текст для ошибки ORA-01804 в info.php в строке 6
Любая помощь будет отличной. Благодарю.
2 ответа
У меня была похожая проблема, когда я впервые установил Instant Client на Mac OS/X.
Я нашел следующий блог:
Надеюсь, это будет работать и для вас.
Я тоже некоторое время пытался найти решение "PHP Warning: oci_new_connect(): OCIEnvNlsCreate() failed. There is something wrong with your system - please check that DYLD_LIBRARY_PATH includes the directory with Oracle Instant Client libraries"
ошибка в Mac OS X. Наконец, после долгих исследований, я нашел решение, которое исправляет эту ошибку, и хотел бы поделиться им здесь, чтобы помочь другим.
В качестве небольшого фона я использую предоставляемую Apple установку PHP на OS X 10.8.4 (PHP 5.3.15 с Suhosin-Patch) и использую репозиторий PECL для установки расширения OCI8 после того, как я скачал Oracle Instant Client загрузки с Oracle.com.
Я также проверил все решения для этой ошибки, которые мне удалось найти в Интернете, включая настройку DYLD_LIBRARY_PATH
, ORACLE_HOME
, а также LD_LIBRARY_PATH
системные переменные окружения в моем ~/.bash_profile
а также ~/.bashrc
файлы; пытаясь настроить переменные среды через Apache mod_env
модуль и SetEnv
в httpd.conf
; установка переменных среды через putenv("DYLD_LIBRARY_PATH=/...")
в коде PHP; а также другие предложения, но все не удалось решить ошибку.
Единственное работающее решение, которое я нашел в прошлом и которое я использовал в своей предыдущей установке OS X 10.7.8, включало копирование содержимого библиотек Oracle Instant Client в постоянно ищущиеся, но скрытые системные папки: /usr/include
, /usr/bin
, а также /usr/lib
, Однако я чувствовал, что это решение не было идеальным и потенциально усложнило бы поддержание и обновление библиотек в долгосрочной перспективе, и я чувствовал, что устойчивое решение этой проблемы должно где-то существовать.
Наконец, после долгих дополнительных исследований, я наткнулся на пост на форумах OpenSUSE, в котором подробно рассказывалось, как группа пользователей там решала ту же ошибку OCI в Apache / PHP на OpenSUSE. Пост форума также расширился комментариями, которые я видел в других постах форума, в которых говорилось о наличии нескольких типов "переменных среды" в типичной установке Apache / PHP:
- Существуют переменные среды Apache, которые обычно настраиваются через
mod_env
- они появляются вApache Environment
разделphp_info()
стр. - Существуют переменные среды PHP, обычно устанавливаемые через
php.ini
или жеputenv()
и стать доступным в ваших скриптах черезgetenv()
и подобные методы. - Наконец, есть то, что я здесь называю "переменными среды, специфичными для процесса" - это переменные среды, которые должны быть настроены до запуска процесса Apache и как часть самого процесса запуска Apache. Недостаточно указывать эти переменные среды в
~/.bash_profile
например. Эти специальные переменные среды наследуются процессом Apache, когда он запускается, и, что особенно важно, всеми его дочерними процессами, включая другие порождения процесса Apache, и самим PHP - и именно эти "специфичные для процесса переменные среды" нам необходимо настроить чтобы постоянно и устойчиво решать нашу проблему с библиотекой OCI8. При правильной настройке эти переменные среды появятся вEnvironment Variables
разделphp_info()
стр.
Подсказка, которая привела меня к решению для Mac OS X, была в посте на форуме OpenSUSE, в котором содержался комментарий участника форума, key_nap, который заметил, что когда процесс Apache запускался в OpenSUSE, загружался также специальный файл конфигурации., Этот файл, /usr/share/apache2/load_configuration
оказался сценарием bash, и им пришло в голову, что они могут включать соответствующие export DYLD_LIBRARY_PATH=...
операторы в этом скрипте bash, и что, конфигурируя переменные окружения там, они будут наследоваться процессом Apache и его дочерними элементами при запуске.
Это заставило меня задуматься о том, где в Mac OS X мы сможем правильно настроить те же "переменные среды, специфичные для процесса". Как launchd
я использую почти исключительно в OS X для обработки загрузки системных процессов, мне было интересно, сможем ли мы настроить необходимые переменные среды в Apache launchd
конфигурационный файл? На OS X 10.8 вы должны найти Apache launchd
конфигурация .plist
файл в /System/Library/LaunchDaemons/org.apache.httpd.plist
, Когда я открыл файл в моей системе, я сразу же заметил раздел для указания переменных среды!
Поэтому наше решение (протестированное для работы в Mac OS X 10.8.4) заключалось в редактировании org.apache.httpd.plist
файл, как показано ниже (обратите внимание на включение ORACLE_HOME
, DYLD_LIBRARY_PATH
, а также LD_LIBRARY_PATH
в разделе Environment Variables файла), а затем перезапустите Apache, запустив sudo apachectl restart
из терминала.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Disabled</key>
<true/>
<key>Label</key>
<string>org.apache.httpd</string>
<key>EnvironmentVariables</key>
<dict>
<key>XPC_SERVICES_UNAVAILABLE</key>
<string>1</string>
<key>ORACLE_HOME</key>
<string>/Users/workstation/Oracle</string>
<key>DYLD_LIBRARY_PATH</key>
<string>/Users/workstation/Oracle/lib</string>
<key>LD_LIBRARY_PATH</key>
<string>/Users/workstation/Oracle/lib</string>
</dict>
<key>ProgramArguments</key>
<array>
<string>/usr/sbin/httpd-wrapper</string>
<string>-D</string>
<string>FOREGROUND</string>
</array>
<key>OnDemand</key>
<false/>
<key>SHAuthorizationRight</key>
<string>system.preferences</string>
</dict>
</plist>
Добавляя эти определения "переменная среды, специфичная для процесса" в Apache launchd
Конфигурационный файл, мы гарантируем, что эти переменные среды правильно наследуются Apache и всеми его дочерними процессами, которые включают PHP и любые модули, загружаемые PHP, такие как OCI8! Вы, очевидно, должны заменить путь /Users/workstation/Oracle/...
показано в примере выше с правильными путями к вашей собственной установке клиентских библиотек Oracle - используйте те же значения, что и при указании этих переменных среды в вашем ~/.bash_profile
,
Также убедитесь, что у вас установлена правильная версия Oracle Instant Client Libraries для вашей системы - т.е. 32-битный или 64-битный варианты, в зависимости от того, какую версию OS X вы используете, а также от того, работают ли Apache и PHP или нет. 32- или 64-битный режим. На OS X 10.8 и выше, Apache/PHP должен работать как 64-битные процессы. Если вы не уверены, вы можете сделать то, что я делал на моем предыдущем Mac, и объединить 32- и 64-разрядные версии двоичных библиотек Oracle Instant Client в единые многофункциональные толстые двоичные файлы, используя lipo
инструмент из XCode, который создаст двоичные файлы, которые загружаются на любую платформу.
Наконец, решение, подробно описанное выше для настройки переменных среды в Apache launchd
Конфигурационный файл также должен работать для устранения аналогичных ошибок в других модулях PHP, работающих через Apache, которые используют переменные среды для поиска связанных библиотек. Если PHP запускается из командной строки, вы сможете указать все переменные окружения, которые вам нужны в вашем ~/.bash_profile
и / или ~/.bashrc
файлы.