Я использую Xamppp для macos на OSX 10.9 с Php 5.4.19 Я установил oacle instantclient, и я вижу, что oci8 включен в phpinfo (ниже):
Поддержка OCI8 Версия 1.4.9 Редакция $ 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 в инфо.php on line 6
Любая помощь будет большой. Благодарю.
У меня была аналогичная проблема, когда я впервые установил 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.
Я также проверил все решения этой ошибки, которые я смог найти в Интернете, включая установку LD_LIBRARY_PATH
системной среды DYLD_LIBRARY_PATH
, ORACLE_HOME
и LD_LIBRARY_PATH
в файлах ~/.bash_profile
и ~/.bashrc
; попытка настроить переменные среды через модуль mod_env
Apache и 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:
mod_env
– они появляются в разделе Apache Environment
на php_info()
. php.ini
или putenv()
, и становятся доступными в ваших скриптах с помощью getenv()
и аналогичных методов. ~/.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=...
выражения export DYLD_LIBRARY_PATH=...
в этом сценарии bash, а также путем настройки переменных среды , что они будут унаследованы процессом Apache и его дочерними элементами при запуске.
Это заставило меня задаться вопросом, где в Mac OS X мы сможем правильно настроить те же «переменные среды для конкретных процессов». Поскольку для работы с загрузкой системных процессов почти исключительно на OS X используется launchd
, я задавался вопросом, можем ли мы настроить необходимые переменные среды в файле конфигурации launchd
? В OS X 10.8 вы должны найти файл конфигурации .plist
для 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
в раздел EnvironmentVariables файла) , а затем перезапустить 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, мы гарантируем, что эти переменные среды правильно унаследованы Apache и всеми его дочерними процессами, включая PHP и любые модули PHP, такие как OCI8! Очевидно, вы должны заменить путь /Users/workstation/Oracle/...
показанный в приведенном выше примере, с правильными путями к вашей собственной установке библиотек клиентов Oracle – используйте те же значения, что и при указании этих переменных среды в ~/.bash_profile
.
Также убедитесь, что у вас установлена правильная версия библиотек мгновенных мгновенных данных Oracle для вашей системы – то есть либо 32-разрядные, либо 64-разрядные варианты в зависимости от того, какая версия OS X вы используете, и работает ли Apache и PHP в 32- или 64-разрядный режим. В OS X 10.8 и выше Apache / PHP должен работать как 64-битные процессы. Если вы не уверены, вы можете сделать то, что я сделал на своем предыдущем Mac, и объединить 32- и 64-разрядные версии бинарных файлов библиотеки Oracle Instant Client в единые многоадресные жировые двоичные файлы, используя инструмент lipo из XCode, который будет создавать двоичные файлы которые загружаются на любой платформе.
Наконец, решение, подробно описанное выше, чтобы настроить переменные среды в файле конфигурации запуска запуска Apache, также должно работать для решения подобных ошибок в других PHP-модулях, запущенных через Apache, которые полагаются на переменные среды для поиска связанных библиотек. Если вы используете PHP из командной строки, вы должны указать все переменные среды, которые вам нужны в файлах ~/.bash_profile
и / или ~/.bashrc
.