自定义进程中 Error while sending STMT_PREPARE packet

swordman

问题描述

在自定义的进程中, 定时任务每隔15秒运行一次,偶尔会出现下面错误

PHP Warning: Error while sending STMT_PREPARE packet. PID=28321 in /data/www/wb/vendor/illuminate/database/Connection.php on line 458

PHP Warning: PDO::prepare(): MySQL server has gone away in /data/www/wb/vendor/illuminate/database/Connection.php on line 458

Warning: PDO::prepare(): MySQL server has gone away in /data/www/wb/vendor/illuminate/database/Connection.php on line 458

我尝试使用一个新的自定义进程,每隔50秒操作一次数据库,但是没有解决到问题,请问各位大佬还有什么其他办法处理吗?

运行环境

Workerman version:4.0.19 PHP version:7.3.9

为此你搜索到了哪些方案及不适用的原因

107 1 0
1个回答

walkor

看下数据库是否重启过
建议用高版本php,这样能用高版本 illuminate/database, 它底层有做重连

  • swordman 9天前

    谢谢。数据库是云数据库, 应该是不会重启。 我先升级下PHP8版本,再测试下。

  • walkor 9天前

    云数据库60秒没访问连接会被云数据库清理掉,所以要保证每小于60秒访问一次数据库保活。
    新建一个新的进程50秒一次访问数据库只能保活新的进程的数据库连接,对任务进程没有效果。
    所以任务进程也需要50秒通讯一次数据库。

  • swordman 9天前

    我看了下数据库的wait_timeout=3600, 不知道是不是你说的这个60秒的设置, 我先按照你说的这个试试,在每个任务进程做一个50秒的通讯操作。

  • walkor 9天前

    60秒清理连接不是数据库的配置导致的,不是开发者能控制的,并且这个连接清理没有fin包,应用层无法感知到连接断开。只能通过心跳维持。

  • swordman 9天前

    谢谢指导。 我还没有升级PHP, 但是按照你说的在任务进程50秒通讯一次, 从昨天晚上修改后到今天, 没有报错了。我今天再观察一天,后面升级PHP8再测试。

×
🔝