У меня есть ситуация, в которой у нас есть две производственные базы данных, которые синхронизируются друг с другом. Сервер Один считается основным. Иногда из-за технического обслуживания или аварии 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++)