gpt4 book ai didi

php - 为什么 PHP 的 oci_connect 不返回 false?

转载 作者:搜寻专家 更新时间:2023-10-30 22:21:36 25 4
gpt4 key购买 nike

我遇到这样一种情况,我们有两个相互同步的生产数据库。服务器一被认为是主要的。有时由于维护或灾难,服务器二将成为主要服务器。

在我们的一些代码中,这意味着我们必须手动进入并编辑数据库连接的服务器名称。我觉得这很烦人,所以我写的最后一件事是为两者放置服务器信息并设置一个循环。如果 oci_connect 在服务器一上失败 3 次,它将移至服务器二。如果服务器二失败 3 次,它会通知用户无法建立连接。

在我们遇到切换服务器的情况时,这在大多数情况下都运行良好。例如,昨天它运行良好。今天没有。它只是不停地坐着旋转。 PHP 错误日志中没有错误。没有失败继续前进。没有错误输出到屏幕。 5 分钟内什么都没有。

然后我不得不手动编辑愚蠢的配置文件。

我问可能有什么不同,我被告知“昨天数据库宕机了,但服务器没宕机。今天服务器宕机了。”好的...?但我看不出有什么区别。如果不能与服务器建立任何类型的通信,我希望 oci_connect 返回 false。我希望它超时和错误。当它从服务器收到错误代码时,不只是传递它。例如,如果出现网络问题怎么办?

这是 oci_connect 中的一个错误,还是我们的 PHP 配置中的某些东西可能给 oci_connect 一个疯狂的长超时?

如果它是一种“错误”,我可以通过某种方式检查服务器是否已启动?像 ping? (当然,当我通过命令提示符执行 ping 操作时,我收到了服务器一号的响应,然后被告知“它现在回来了”,尽管我对此时间持怀疑态度。)

无论如何,如果有人能阐明为什么 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++)

最佳答案

你能确认它没有返回 false 吗?它可能只是在等待连接时阻塞吗? (如果你执行 var_dump(oci_connect(...)) 会发生什么?

来自 php.net 的 documentation :

If you want to specify a connection timeout in case there is network problem, you can edit the client side (e.g. PHP side) sqlnet.ora file and set SQLNET.OUTBOUND_CONNECT_TIMEOUT. This sets the upper time limit for establishing a connection right through to the DB, including the time for attempts to connect to other services. It is available from Oracle 10.2.0.3 onwards.

In Oracle 11.1, a slightly lighter-weight solution TCP.CONNECT_TIMEOUT was introduced. It also is a sqlnet.ora parameter. It bounds just the TCP connection establishment time, which is mostly where connection problem are seen.

The client sqlnet.ora file should be put in the same directory as the tnsnames.ora file.

此外,您可能想查看 FAN on this page ...看起来它可能完全符合您的要求(但我没有这方面的经验,所以我不确定它是否真的适合您)。

关于php - 为什么 PHP 的 oci_connect 不返回 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2922118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com