Oracle 11g PHP oci не удается подключиться OCIEnvNlsCreate()
Проблема: Linux CentOS/Oracle 11g/instantclient/PHP 5.3.3
Ошибка: oci_connect(): ошибка OCIEnvNlsCreate(). В вашей системе что-то не так - пожалуйста, проверьте, что заданы параметры ORACLE_HOME и LD_LIBRARY_PATH, и укажите правильные каталоги
Phpinfo() соответствующие разделы:
Как вы видите, переменные среды заданы правильно, и я могу повторить их на странице с помощью 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();
Я перепробовал все трюки, которые нашел в гугле, но ничего не помогло.
Любая помощь будет оценена по достоинству.
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
.
Переустановите oci8. Столько раз, сколько потребуется. Не заставляй себя. Принуждение только усугубляет ситуацию. Кроме того, попробуйте скомпилировать его (иначе говоря, загрузите пакет, используя
./configure -'all the fancy commands you'll need to use'
, а затемmake install
).Убедитесь, что вы получили правильное
LD_LIBRARY_PATH
. Забавно говорить, правда? Вы, вероятно, не заметили, что oracle создала папкуclient/lib/
в N разных местах, которая содержит более или менее одни и те же файлы, и единственная разница между ними заключается в том, что выбор всех папок, кроме одной, приведет к упомянутой ошибке . Проверка на вменяемость?Переустановите php/apache. Вполне вероятно, что у вас была какая-то старая установка, которая вызывает проблемы. Поэтому используйте
apt-get purge php*
илиyum remove php*
или что-то еще, что делает тот же трюк для вашего дистрибутива, будет хорошим началом.
РЕДАКТИРОВАТЬ После обновления PHP проблема повторилась, на этот раз с другим решение.
-
ОТРЕДАКТИРУЙТЕ SYSCONFIG Отредактируйте файл /etc/sysconfig/httpd. Добавьте эти 2 строки в конце:
Экспортировать LD_LIBRARY_PATH=/путь/к.lib экспортировать ORACLE_HOME=/путь/к/дому
СДАВАЙТЕСЬ И ПРОЧИТАЙТЕ РУКОВОДСТВО его можно найти здесь.
Если ничего из этого не поможет, не стесняйтесь искать решение в стене скорби...
Я также сам занимался этими же проблемами и нашел решение.
Решение в моем случае было:
- Ошибка: Ошибка: 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 будет авторизован для подключения бд.
Я сам занимался этими же проблемами, за исключением системы Ubuntu. Мы обошли это, установив переменные среды непосредственно в /etc/environment и исключив их из конфигурации apache. Просто добавьте переменные в нижней части файла среды, и они будут применяться во всей системе.
Добавьте свою пользовательскую переменную среды в сценарий инициализации 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
Надеюсь, это поможет
Я только что решил эту же проблему в:
- Апач
- Центос 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
Надеюсь, это поможет!
Вам необходимо скопировать все содержимое мгновенного клиента в apache/bin
Я использую xampp и работаю на меня.
Скопируйте все файлы мгновенного клиента введите описание изображения здесь в apache/bin