【问题标题】:Why PDO generates warnings when we tell it not to do it?为什么当我们告诉它不要这样做时 PDO 会生成警告?
【发布时间】:2016-02-11 13:55:43
【问题描述】:

问题

我们告诉 PDO 将每个问题包装到异常中。 在某些情况下,它会生成一些警告,然后才会引发异常。

为什么会这样做?

重复?

关于 SO 没有关于它的正确答案。最后一个问题是PHP PDO Exception + Warning on MySQL Has Gone Away?,但人们只是将其标记为重复,而不是仔细回答。

接受的答案不能回答为什么这样做以及何时这样做。所以我研究并会回答。

【问题讨论】:

    标签: php pdo mysqlnd


    【解决方案1】:

    这是因为 PDO 可以使用 mysqlnd 驱动程序,它不遵守任何 PDO 的“convert-issues-to-extensions”策略。

    看看sources of mysqlnd driver

    我们清楚地看到直接调用php_error_docref

    其中一个示例,显示在previous question,由以下几行解释:https://github.com/php/php-src/blob/PHP-5.5.31/ext/mysqlnd/mysqlnd_wireprotocol.c#L35:L61

    【讨论】:

      【解决方案2】:

      使用 set_error_handler() 和 restore_error_handler()

      public function query($sql)
      {
          $retries = 0;
          $result = null;
      
          while (true) {
              try {
                  set_error_handler(function () {
                  });
                  $result = $this->pdo->query($sql);
                  restore_error_handler();
                  break;
              } catch (Exception $e) {
                  restore_error_handler();
                  if (++$retries < self::RECONNECT_ATTEMPT) {
                      if (strpos($e->getMessage(), 'server has gone away') !== false) {
                          $this->connect();
                          $this->getLogger()->info('Reconnect database, reason: server has gone away');
                      }
                  } else {
                      throw $e;
                  }
              }
          }
          return $result;
      }
      

      【讨论】:

      • 这很明显。问题是关于“为什么”会发生。不是怎么治的。无论如何,它会帮助那些不知道它的人。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 2012-10-25
      • 1970-01-01
      相关资源
      最近更新 更多