关于 PHP 使用 mysqli 长连接报错

使用的workerman框架,常驻进程

mysql链接使用的mysqli的长连接

self::$mysqli  = mysqli_connect('p:'.$host.':'.$port, $user, $pass);

因为连接有超时问题,所以我们会定时ping一下mysql

self::$mysqli  = mysqli_connect('p:'.$host.':'.$port, $user, $pass);
if (!self::$mysqli->ping())
{
    write_log();
    write_error();
}

现在发现进程很长时间没有与mysql通讯的话,新的请求过来的时候,会在mysqli_connect这里报错。

'mysqli_connect(): MySQL server has gone away'
'mysqli_connect(): send of 61 bytes failed with errno=32 Broken pipe'

查看了日志之后,发现mysql的ping返回正常,没有报错。
而且在mysqli_connect报错之后的那次查询,也会成功执行和返回。
但是这里有可能导致进程挂掉,所以有隐患。

请问这个长连接为什么会有这种报错,并且还不影响数据返回,有没有什么办法解决这个报错?

讨论数量: 2

mysql里面有个配置,10小时没连接就不能连接了。 就这种服务的话得占用一个连接。

我以前的处理方案是每次循环去读一次库,保持连接。

4年前 评论
carmelono1 (楼主) 4年前

伪代码

file

4年前 评论
carmelono1 (楼主) 4年前
declandragon (作者) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!