[英]Why doesn't PHP's oci_connect return false?
我遇到的情况是,我们有两个彼此同步的生产数据库。 服务器一被认为是主要的。 有时由于维护或灾难,服务器二将成为主要服务器。
在我们的某些代码中,这意味着我们必须手动进入并编辑数据库连接的服务器名称。 我觉得这很烦人,所以我写的最后一件事是将两者的服务器信息放在一起并建立一个循环。 如果oci_connect在服务器1上失败3次,则将继续进行到服务器2。 如果服务器2失败3次,它将通知用户无法建立连接。
在大多数情况下,当我们遇到切换服务器的情况时,这种方法都可以正常工作。 例如,昨天效果很好。 今天没有。 它只是坐着不停地旋转。 PHP错误日志中没有错误。 继续前进没有失败。 没有错误输出到屏幕。 5分钟没事。
因此,我不得不手动编辑愚蠢的配置文件。
我问可能有什么不同,然后我被告知“昨天数据库已关闭,但服务器未关闭。今天服务器已关闭。” 好的...? 但是我看不出任何区别。 如果无法与服务器建立任何形式的通信,我希望oci_connect返回false。 我希望它超时和错误。 当它从服务器接收到错误代码时,不仅要传递它。 例如,如果出现网络问题怎么办?
这是oci_connect中的错误,还是我们的PHP配置中的某些内容使oci_connect疯狂地超时?
如果这是一种“错误”,是否可以通过某种方式检查服务器是否先启动? 像平吗? (当然,当我通过命令提示符执行ping操作时,我从服务器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++)
您可以验证它没有返回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文件放在同一目录中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.