oci_connect на PHP 5.2.0-8 не работает с Oracle 11g - PullRequest
0 голосов
/ 18 февраля 2020

Я использовал PHP 5.2.0-8 + etch16 / oci_connect для подключения к базе данных Oracle моей компании и отображения информации на нашем веб-сайте (доступном для внешних IP-адресов). С тех пор, как мы обновили нашу версию БД (до 11g Release 11.2.0.4.0), я больше не могу подключиться к базе данных.

Страница продолжает загружаться (oci_set_call_timeout не работает), и ничего не отображается , Я знаю, что код работает, и учетные данные в порядке, потому что я использую тот же код на другой странице (видимой только для внутренних IP-адресов), и у меня не было никаких проблем после обновления. Я использую следующий код:

$conn = oci_connect('user', 'password', 'server', 'charset');
if (!$conn) {
    $e = oci_error();
    trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
    echo "Error";
}
else{
    echo "OK";
}

При запуске phpinfo возвращается раздел oci:

oci8
OCI8 Support    enabled
Version     1.4.5
Revision    $Revision: 305257 $
Active Persistent Connections   0
Active Connections  0
Oracle Instant Client Version   11.1
Temporary Lob support   enabled
Collections support     enabled

Directive   Local Value Master Value
oci8.connection_class   no value    no value
oci8.default_prefetch   100 100
oci8.events Off Off
oci8.max_persistent -1  -1
oci8.old_oci_close_semantics    Off Off
oci8.persistent_timeout -1  -1
oci8.ping_interval  60  60
oci8.privileged_connect Off Off
oci8.statement_cache_size   20  20

На странице, доступной только для внутренних IP-адресов, версия oci имеет вид 1.4.9, и он работает на Windows Server 2003 (я знаю, что он старый). Внешняя страница (не работающая) имеет версию 1.4.5 oci и работает в формате Linux jedi-ng 2.6.25. У меня нет доступа к linux серверу (только к папке, где хранится php / html), но я могу запустить некоторые вещи, используя shell_exec().

Это проблема с версией (Я не могу больше подключиться к Oracle 11g, используя старую версию php / oci) или это просто проблема с подключением, которую я могу решить, попробовав другой подход?

Не стесняйтесь задавать вопросы, если вам нужно .

Заранее спасибо.

1 Ответ

0 голосов
/ 19 февраля 2020
  • Добавьте это в начало вашего тестового скрипта и посмотрите, получите ли вы лучшее сообщение об ошибке:

    error_reporting(E_ALL|E_STRICT);
    ini_set('display_errors', 'On');
    
  • Ключевая вещь - версия библиотеки Oracle, используемые PHP OCI8, а не версия базы данных, к которой вы подключаетесь. В некоторых средах наблюдается некоторое совпадение, поскольку библиотеки могут использоваться при установке программного обеспечения базы данных. Если у вас есть удаленная база данных, тогда PHP OCI8 может (должен) использовать библиотеки из Oracle Instant Client (эта ссылка для 64-битных пакетов - используйте 32-битный Instant Client, если вы 32-битные PHP).

  • Если у вас нет OCI8 PHP 2.2.2 и вы используете Oracle клиентские библиотеки 18 c или позже, oci_set_call_timeout() будет недоступен.

  • Если я правильно прочитал ваш вопрос, у вас есть проблема с Linux? В этом случае убедитесь, что LD_LIBRARY_PATH установлен правильно для вашей версии веб-сервера, например, вам может потребоваться установить его в /etc/sysconfig/httpd (я не знаю ваш Linux вариант, так что это может отличаться). Часто гораздо проще использовать ldconfig, как показано в инструкции по установке Instant Client

...