Ошибка мгновенного клиента 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.

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

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

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

Я тоже некоторое время пытался найти решение "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 файлы.

Другие вопросы по тегам