代码之家  ›  专栏  ›  技术社区  ›  morewry

为什么PHP的oci\u connect不返回false?

  •  1
  • morewry  · 技术社区  · 15 年前

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

    所以我不得不手动编辑这个愚蠢的配置文件。

    我问可能有什么不同,我被告知“昨天数据库坏了,但服务器坏了。今天服务器坏了。“好吧…”。。。?但我看不出有什么区别。如果oci\ U connect无法与服务器建立任何类型的通信,我希望它返回false。我希望它会超时并出错。当它从服务器接收到错误代码时不只是传递它。例如,如果有网络问题怎么办?

    如果这是一种“错误”,有没有什么方法可以让我先检查服务器是否启动了?像平(当然,当我通过命令提示符ping时,我从serverone得到了一个响应,然后被告知“它现在回来了”,尽管我对此时间持怀疑态度。)

    不管怎样,如果有人能解释为什么oci\U connect可以无休止地运行而不失败,以及如何防止它这样做,我将不胜感激。

     $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 回复  |  直到 15 年前
        1
  •  3
  •   ircmaxell    15 年前

    你能确认它没有返回false吗?它是否只是在等待连接时阻塞(如果你这样做了会怎么样 var_dump(oci_connect(...)) ?

    从php.net的 documentation :

    有网络超时 问题,您可以编辑客户端 (例如PHP端)sqlnet.ora文件和 设置SQLNET.OUTBOUND\u CONNECT\u超时。 到DB,包括时间 尝试连接到其他 服务。可从

    在oracle11.1中 引入了TCP.CONNECT\u超时。 它也是一个sqlnet.ora参数。它 只限制TCP连接 成立时间,主要是 出现连接问题的地方。

    客户端sqlnet.ora文件应该是 放在与 tnsnames.ora文件。

    另外,你可能想退房 FAN on this page