Почему PHP oci_connect не возвращает false? - PullRequest
1 голос
/ 27 мая 2010

У меня есть ситуация, в которой у нас есть две производственные базы данных, которые синхронизируются друг с другом. Сервер Один считается основным. Иногда из-за технического обслуживания или аварии Server Two становится основным.

В некоторых наших кодах это означает, что мы должны вручную войти и отредактировать имя сервера для соединений с базой данных. Я нахожу это раздражающим, поэтому последнее, что я написал, я поставил информацию о сервере для обоих и настроил цикл. Если oci_connect потерпел неудачу на Сервере Один 3 раза, он перешел бы на Сервер Два. Если второй сервер трижды вышел из строя, он уведомит пользователя о невозможности установить соединение.

Это работало нормально в большинстве случаев, когда у нас возникала ситуация переключения серверов. Вчера, например, все работало нормально. Сегодня это не так. Он просто сидел и крутился бесконечно. Нет ошибок в журнале ошибок PHP. Нет отказа двигаться дальше. Нет ошибок вывода на экран. Ничего за 5 минут.

Итак, мне пришлось вручную редактировать глупый файл конфигурации.

Я спросил, что может отличаться, и мне ответили: «Вчера база данных не работала, но не сервер. Сегодня сервер не работает». Хорошо...? Но я не вижу различий. Я ожидал бы, что oci_connect вернет false, если не может установить какую-либо связь с сервером. Я ожидаю, что это время ожидания и ошибка. Не просто передать его, когда он получает код ошибки с сервера. Что, если есть проблема с сетью, например?

Это ошибка в oci_connect или есть вероятность, что что-то в нашей конфигурации PHP дает oci_connect безумно долгий тайм-аут?

Если это своего рода «ошибка», есть ли способ проверить, запущен ли сервер первым? Как пинг? (Конечно, когда я выполнял эхо-запрос через командную строку, я получил ответ от сервера One, а затем мне сказали, что «он вернулся», хотя я скептически отношусь к выбору времени для этого.)

В любом случае, если бы кто-нибудь мог пролить свет на то, почему oci_connect может работать бесконечно без сбоев и как это предотвратить, я был бы благодарен.

- Редактировать: Мой код похож на примеры на PHP.net только в некоторых циклах.

 $count = count($servers);
 for($i = 0; $i < $count; $i++){
      if((!isset($connection)) || ($connection == false)){
           // Attempt to connect to the oracle database
           $connection = @oci_connect($servers[$i]["user"], $servers[$i]["pass"], $servers[$i]["conid"]) or ($conn_error = oracle_error());
           // Try again if there was a failure
           if(($connection == false) || (isset($con_error))){
                // Three (two more) tries per alternative
                for($j = $st; $j < $fn; $j++){
                     // Try again to connect
                     $connection = @oci_connect($servers[$i]["user"], $servers[$i]["pass"], $servers[$i]["conid"]) or ($conn_error = oracle_error());
                } // for($j = 2; $j < 4; $j++)
           } // if($connection == false)
      } // if(!isset($connection) || ($connection == false))
 } // for($i = 0; $i < $count; $i++)

1 Ответ

3 голосов
/ 27 мая 2010

Можете ли вы убедиться, что он не возвращает false? Возможно, это просто блокировка во время ожидания соединения? (что произойдет, если вы сделаете var_dump(oci_connect(...))?

Справа от документации php.net :

Если вы хотите указать соединение таймаут в случае наличия сети проблема, вы можете редактировать на стороне клиента (например, сторона PHP) файл sqlnet.ora и установить SQLNET.OUTBOUND_CONNECT_TIMEOUT. Это устанавливает верхний предел времени для установление права на соединение до БД, включая время за попытки подключиться к другим Сервисы. Это доступно из Oracle 10.2.0.3 и более поздних версий.

В Oracle 11.1 немного облегченное решение TCP.CONNECT_TIMEOUT был представлен. Это также параметр sqlnet.ora. Это ограничивает только TCP-соединение время создания, которое в основном где проблема с подключением видна.

Клиентский файл sqlnet.ora должен быть положить в тот же каталог, что и Файл tnsnames.ora.

Кроме того, вы можете проверить ВЕНТИЛЯТОР на этой странице ... Похоже, он может делать именно то, что вы хотите (но у меня нет опыта с этим, поэтому я не уверен это действительно правильно для вас).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...