当我们告诉它不要这样做时,为什么PDO会产生警告?

时间:2016-02-11 13:55:43

标签: php pdo mysqlnd

问题

我们告诉PDO将每个问题包装成例外。 在某些情况下,它会生成一些警告,然后才会抛出异常。

为什么会这样做?

重复吗

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

接受的答案没有答案为什么要这样做以及什么时候。所以我研究并将回答。

2 个答案:

答案 0 :(得分:3)

因为PDO可以使用mysqlnd驱动程序,而不考虑任何PDO"转换问题到扩展程序"政策。

只需看看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

答案 1 :(得分:0)

使用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;
}