Ошибка ПУТИ К БИБЛИОТЕКЕ Oracle instantclient DYLD


Я использую Xamppp для macos на OSX 10.9 с Php 5.4.19 Я установил oracle instantclient и вижу, что oci8 включен в phpinfo (ниже):

Включена поддержка OCI8 Версия 1.4.9 Идентификатор редакции $: 44bfa713983a99b3e59477f6532e5fb51b6dee94$ Активные Постоянные Соединения 0 Активные соединения 0

Я вижу, что DYLD_LIBRARY_PATH также установлен в моем phpinfo.

DYLD_LIBRARY_PATH/usr/локальный/мгновенный клиент/11.2.0.3

Но когда я пытаюсь подключение с помощью php я уже два дня получаю одну и ту же ошибку:(

Предупреждение: oci_connect(): ошибка OCIEnvNlsCreate(). В вашей системе что-то не так - пожалуйста, проверьте, что DYLD_LIBRARY_PATH включает каталог с клиентскими библиотеками Oracle Instant в info.php на линии 6 Предупреждение: oci_connect(): Ошибка при попытке получить текст для ошибки ORA-01804 в info.php в строке 6

Любая помощь была бы очень кстати. Спасибо.

2 answers

У меня была аналогичная проблема, когда я впервые установил мгновенный клиент на Mac OS/X.

Я нашел следующий блог:

Http://blog.caseylucas.com/2013/03/03/oracle-sqlplus-and-instant-client-on-mac-osx-without-dyld_library_path/

Надеюсь, это сработает и для вас.

 1
Author: Mark J. Bobak, 2013-11-21 09:44:50

Я тоже некоторое время пытался найти решение "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-патчем) и использовал репозиторий PECL для установки расширения OCI8 после того, как я загрузил мгновенные загрузки клиента Oracle с 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 в постоянно просматриваемые, но скрытые системные папки: /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 в раздел Переменных среды файла), а затем перезапустить 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, установленные для вашей системы, т. е. 32-разрядные или 64-разрядные варианты в зависимости от версии OS X, которую вы используете, и от того, работают ли Apache и PHP в 32- или 64-разрядном режиме. В OS X 10.8 и выше Apache/PHP должен работать как 64-разрядные процессы. Если вы не уверены, вы можете сделать то, что я делал на своем предыдущем Mac, и объединить 32- и 64-разрядные версии двоичных файлов клиентской библиотеки Oracle Instant в единые многоархитектурные двоичные файлы fat, используя lipo инструмент из XCode, который будет создавать двоичные файлы, загружаемые на любой платформе.

Наконец, описанное выше решение для настройки переменных среды в файле конфигурации Apache launchd также должно работать для устранения аналогичных ошибок в других модулях PHP, запускаемых через Apache, которые полагаются на переменные среды для поиска своих связанных библиотек. При запуске PHP из командной строки вы должны иметь возможность указать все необходимые переменные среды в ваших файлах ~/.bash_profile и/или ~/.bashrc.

 8
Author: bluebinary, 2013-12-18 23:41:37