Php zf2。如何在循环cli脚本中处理mysql连接超时?

Php zf2。如何在循环cli脚本中处理mysql连接超时?,php,mysql,doctrine-orm,zend-framework2,command-line-interface,Php,Mysql,Doctrine Orm,Zend Framework2,Command Line Interface,有一个无限循环do{dosomethingifeeded();}while(true)在cli php脚本中运行,如果满足条件,则使用dosomethingifeeded()执行一些DB操作 问题是等待时间甚至可能长达12小时,因此我得到了一般性错误:2006年MySQL服务器在异常跟踪结束时消失了doctor\DBAL\Connection::executeQuery 我应该如何处理有关的问题?我是否应该将mysql配置为正常处理长时间等待的cli脚本,而不影响常见的php fpm脚本 我有几

有一个无限循环
do{dosomethingifeeded();}while(true)
在cli php脚本中运行,如果满足条件,则使用
dosomethingifeeded()
执行一些DB操作

问题是等待时间甚至可能长达12小时,因此我得到了一般性错误:2006年MySQL服务器在异常跟踪结束时消失了
doctor\DBAL\Connection::executeQuery

我应该如何处理有关的问题?我是否应该将mysql配置为正常处理长时间等待的cli脚本,而不影响常见的php fpm脚本

我有几个想法

  • 向cli脚本添加ping(每分钟仅执行
    select 1
  • 将等待超时设置为86400
  • 还有别的吗
  • Upd:找到了zf2+doctrine2的解决方案-


    Upd2:找到了使用zf2的解决方案
    ServiceManager
    -

    您只需在不使用时断开连接,然后在符合您条件的情况下重新连接MySQL即可。我怀疑这会对业绩产生负面影响。例如:

    while (true) {
        if ($condition) {
            $db->connect();
            /* your code goes here */
            $db->disconnect();
        }
    }
    
    如果出于某种原因,你想让它保持打开状态,你可以让它在一分钟不活动后与MySQL断开连接,例如

    $lastActiveTime = 0;
    $isConnected = false;
    while (true) {
        if ((time()-$lastActiveTime)>60) {
            $isConnected = false;
            $db->disconnect();
        }
        if ($condition) {
            if (!$isConnected) $db->connect();
            $lastActiveTime = time();
        }
    }
    

    需要时创建连接?保持连接打开可能会产生意外的副作用,特别是当您依靠连接关闭来提交事务时。@frz3993并在每次执行后将其删除?您是否有特定的zf2+解决方案?它会在执行开始时自动连接。这有帮助吗?其他人也有同样的问题,关键是我几乎无法用zf2风格理解您的答案。但对我来说,不是处理异常而是手动控制超时是一件新鲜事。您有权访问代码中的服务定位器吗?`$this->db=$this->getServiceLocator()->get('db');`?检查这个,我认为如果您发布运行查询的代码,那么我们可以获得有关您如何查询数据库的更多信息,这会有所帮助。