Oracle 11g PHP oci не удается подключиться OCIEnvNlsCreate()


Проблема: Linux CentOS/Oracle 11g/instantclient/PHP 5.3.3

Ошибка: oci_connect(): ошибка OCIEnvNlsCreate(). В вашей системе что-то не так - пожалуйста, проверьте, что заданы параметры ORACLE_HOME и LD_LIBRARY_PATH, и укажите правильные каталоги

Phpinfo() соответствующие разделы:

enter image description here

enter image description here

enter image description here

Как вы видите, переменные среды заданы правильно, и я могу повторить их на странице с помощью getenv(). Я также проверил разрешения на чтение, и я могу прочитать все файлы в этих каталогах с веб-страницы. Файлы клиентской библиотеки находятся там (я дважды устанавливал и переустанавливал) полная установка. Библиотеки доступны для чтения и загрузки.

Ldd не показал никаких ошибок.

Вот вызов из php-файла:

$test = getenv('LD_LIBRARY_PATH')."  ".getenv('ORACLE_HOME');
$this->dbconn = oci_connect("myuser","mypassword", "localhost/orcl") or die("<b>Connection Failed: $test </b>").oci_error();

Я перепробовал все трюки, которые нашел в гугле, но ничего не помогло.
Любая помощь будет оценена по достоинству.

 2
Author: Vadim K., 2013-05-02

6 answers

Не удалось выполнить OCIEnvNlsCreate()? Добро пожаловать в ад...

Я знаю, что поток старый, но проблема все еще присутствует. И обычно ответы на эту проблему перенаправляют на сторонние сайты, обычно 404s.

Давайте начнем с проблемы. Сама ошибка довольно типична. Его документация сводится к "lib разбился... не знаю, почему". Существует широкий спектр решений, включая, но не ограничиваясь настройкой, переустановкой и молитвой "вставить случайное имя бога здесь".

Вот краткий список наиболее распространенных решений:

1. Поместите переменную в свой файл .php.

    putenv("LD_LIBRARY_PATH=$newld");

where $newld is the link to your library.

2. Удалите переменную LD_LIBRARY_PATH, если она существует (да, так, как это было показано в 1.), из вашего php-файла и поместите ее в свой файл apache2.conf или httpd.conf или /etc/environment или в любой файл, который есть в вашем дистрибутиве/версии для переменных среды. Простое руководство можно найти здесь или везде в Интернете. Почему?

Не устанавливайте переменные среды Oracle с помощью putenv() в PHP-скрипте , потому что библиотеки Oracle могут быть загружены и инициализированы до запуска вашего скрипта. Переменные, заданные с помощью putenv(), могут затем вызвать конфликты, сбои или непредсказуемое поведение. Некоторые функции могут работать, но другие может привести к незначительным ошибкам. Переменные должны быть настроены до запуска веб-сервера.

Как указано в документах по установке. Также перезапустите apache после этого. Это на основе дистрибутива/версии, но, скорее всего, команда service httpd restart.

  1. Переустановите oci8. Столько раз, сколько потребуется. Не заставляй себя. Принуждение только усугубляет ситуацию. Кроме того, попробуйте скомпилировать его (иначе говоря, загрузите пакет, используя ./configure -'all the fancy commands you'll need to use', а затем make install).

  2. Убедитесь, что вы получили правильное LD_LIBRARY_PATH. Забавно говорить, правда? Вы, вероятно, не заметили, что oracle создала папку client/lib/ в N разных местах, которая содержит более или менее одни и те же файлы, и единственная разница между ними заключается в том, что выбор всех папок, кроме одной, приведет к упомянутой ошибке . Проверка на вменяемость?

  3. Переустановите php/apache. Вполне вероятно, что у вас была какая-то старая установка, которая вызывает проблемы. Поэтому используйте apt-get purge php* или yum remove php* или что-то еще, что делает тот же трюк для вашего дистрибутива, будет хорошим началом.

РЕДАКТИРОВАТЬ После обновления PHP проблема повторилась, на этот раз с другим решение.

  1. ОТРЕДАКТИРУЙТЕ SYSCONFIG Отредактируйте файл /etc/sysconfig/httpd. Добавьте эти 2 строки в конце:

    Экспортировать LD_LIBRARY_PATH=/путь/к.lib экспортировать ORACLE_HOME=/путь/к/дому

  2. СДАВАЙТЕСЬ И ПРОЧИТАЙТЕ РУКОВОДСТВО его можно найти здесь.

Если ничего из этого не поможет, не стесняйтесь искать решение в стене скорби...

 5
Author: Hristo Valkanov, 2016-02-29 12:38:21

Я также сам занимался этими же проблемами и нашел решение.

Решение в моем случае было:

  1. Ошибка: Ошибка: oci_connect(): Ошибка OCIEnvNlsCreate()

Предоставить разрешения для клиентского каталога и файлов:

sudo chmod -R 777 /usr/lib/oracle/11.2/client64

И

sudo chmod -R 777 /usr/include/oracle/11.2/client64

2. Ошибка, которую я получил позже: ORA-12546: TNS: отказано в разрешении

setsebool -P httpd_can_network_connect 1 

Apache будет авторизован для подключения бд.

 2
Author: sulica, 2017-03-06 13:57:46

Я сам занимался этими же проблемами, за исключением системы Ubuntu. Мы обошли это, установив переменные среды непосредственно в /etc/environment и исключив их из конфигурации apache. Просто добавьте переменные в нижней части файла среды, и они будут применяться во всей системе.

 0
Author: Chad, 2013-05-02 19:13:12

Добавьте свою пользовательскую переменную среды в сценарий инициализации apache. Я использую centos, поэтому скрипт инициализации находится в /etc/init.d/httpd

Просто скопируйте и вставьте файл .bash_profile вашего пользователя oracle в /etc/init.d/httpd

Это мое.

ORACLE_HOSTNAME=ora11g.home.com; export ORACLE_HOSTNAME
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1; export ORACLE_HOME
ORACLE_SID=ora11g; export ORACLE_SID
ORACLE_TERM=xterm; export ORACLE_TERM
PATH=$ORACLE_HOME/bin:/usr/sbin:$PATH; export PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib;
export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib;
export CLASSPATH

Надеюсь, это поможет

 0
Author: Firman Syah, 2015-11-14 12:43:31

Я только что решил эту же проблему в:

  • Апач
  • Центос 7
  • PHP 5
  • Оракул 12cR1

В сообщении говорится:

Пожалуйста, проверьте, что заданы параметры ORACLE_HOME и LD_LIBRARY_PATH, и укажите нужные каталоги

В apache есть файл, в котором вы можете задать переменную среды : /etc/sysconfig/httpd. Для nginx должен быть файл конфигурации.

Я добавил необходимые переменные среды. Предполагая, что

  • ORACLE_HOME - это /oracle/продукт/12.1.0/dbhome_1
  • Клиент Oracle был установлен в разделе /oracle/продукт/12.1.0/клиент

Добавить:

ORACLE_HOME=/oracle/product/12.1.0/dbhome_1
LD_LIBRARY_PATH=/oracle/product/12.1.0/dbhome_1/lib:/oracle/product/12.1.0/dbhome_1/network/lib:/oracle/product/12.1.0/client/lib

Я также добавил:

TNS_ADMIN=/oracle/product/12.1.0/dbhome_1/network/admin
ORACLE_SID=<your sid>

После обновления /etc/sysconfig/httpd Я просто перезапустил службу httpd Apache, и все:

$ sudo systemctl restart httpd

Надеюсь, это поможет!

 0
Author: IvanJijon, 2017-08-24 14:06:56

Вам необходимо скопировать все содержимое мгновенного клиента в apache/bin

Я использую xampp и работаю на меня.

Скопируйте все файлы мгновенного клиента введите описание изображения здесь в apache/bin

 0
Author: Glauber Monteiro, 2018-08-02 20:16:04