PDO连接在API中超时,php-fpm restart解决了它

Wou*_*ter 5 php pdo

我一直从我的代码中得到以下错误:

数据库连接失败:PDO :: __ construct():发送12个字节失败,errno = 110连接超时

这个错误持续发生在api上.如果那个api在白天不停地被调用,那么这种情况就不会发生.只有当api不使用一段时间.

我可以通过执行php-fpm restart/reload来解决这个问题,但这不应该是解决方案.

有谁知道如何解决这个问题?

- 编辑 -

这是连接数据库的代码:

public function connectDatabase($allow_persistent = true)
{
    $this->db = null;

    $this->readINI();

    $pdo_attr = [
        PDO::ATTR_PERSISTENT => $allow_persistent,
        PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET utf8;",
        PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true,
    ];

    $this->db = new PDO("mysql:host=" . $this->db_data_dbhost . ";dbname=" . $this->db_data_dbname . ";charset=utf8", $this->db_data_username, $this->db_data_password, $pdo_attr);

    $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
Run Code Online (Sandbox Code Playgroud)

为了更多地进行迭代,目前在两个API上使用它.

  • 一个是客户一直使用,从来没有遇到过这个问题
  • 第二个并没有被许多客户使用,因为它仍在开发中,只有少数客户用于测试目的.我们确实尝试将应用程序推送到appstore,但它会被此问题击落.如上所述,此API最终会遇到错误,如果不重新启动/重新加载php-fpm服务,将无法从此状态恢复.

Abr*_*lov 2

使用持久连接并不是那么好(看看为什么),但是为了解决这个问题,您可能需要增加 MySQL 连接超时。

要实现此目的,请参阅my.ini 的wait_timeout参数。

ps 另外,您可以捕获此错误并重新连接到数据库。