【发布时间】:2011-02-24 17:06:50
【问题描述】:
我有一种情况,我们有两个相互同步的生产数据库。服务器一被认为是主要的。有时由于维护或灾难,服务器 2 会成为主服务器。
在我们的某些代码中,这意味着我们必须手动进入并编辑数据库连接的服务器名称。我觉得这很烦人,所以我写的最后一件事是我将两者的服务器信息放入并设置了一个循环。如果 oci_connect 在服务器 1 上失败 3 次,它将转到服务器 2。如果服务器 2 失败 3 次,它将通知用户无法建立连接。
在我们遇到切换服务器的大多数情况下,这都能正常工作。例如,昨天,它运行良好。今天没有。它只是坐着无休止地旋转。 PHP 错误日志中没有错误。没有失败继续前进。没有错误输出到屏幕。 5分钟内什么都没有。
所以我不得不手动编辑愚蠢的配置文件。
我问可能有什么不同,我被告知“昨天数据库已关闭,但服务器没有。今天服务器已关闭。”好的...?但我看不出有什么区别。如果 oci_connect 无法与服务器建立任何类型的通信,我希望它返回 false。我希望它超时和错误。当它从服务器接收到错误代码时,不仅仅是传递它。例如,如果出现网络问题怎么办?
这是 oci_connect 中的一个错误,还是我们的 PHP 配置中的某些东西有可能给 oci_connect 一个疯狂的长时间超时?
如果它是一种“错误”,有什么方法可以检查服务器是否首先启动?像 ping 一样? (当然,当我通过命令提示符执行 ping 操作时,我得到了 Server 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++)
【问题讨论】:
-
oci_connect 应该在失败时返回 false。你的连接脚本是什么样的?
-
我同意。它有时会在失败时返回错误。代码已经按预期工作了好几次,直到有一天我遇到了这个问题。有人告诉我,“昨天数据库宕机了,但服务器没有。今天服务器宕机了。”是工作日和非工作日的区别。
标签: php database oracle timeout