oci_connect на PHP 5.2.0-8 не работает с Oracle 11g

Я использовал PHP 5.2.0-8+etch16 / oci_connect для подключения к базе данных Oracle моей компании и отображения информации на нашем веб-сайте (доступном для внешних IP-адресов). С тех пор, как мы обновили нашу версию БД (до версии 11g 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 (я знаю, что она старая). Внешняя страница (та, которая не работает) имеет oci версию 1.4.5 и работает в Linux jedi-ng 2.6.25. У меня нет доступа к серверу linux (только к папке, где хранится php/html), но я могу запускать некоторые вещи, используя shell_exec().

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

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

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


person Lucas Lisboa    schedule 18.02.2020    source источник


Ответы (1)


  • Добавьте это в начало своего тестового сценария и посмотрите, станет ли сообщение об ошибке лучше:

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

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

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

person Christopher Jones    schedule 19.02.2020