每日定时任务,总会提示:Mysql gone away

siyuankeji

问题描述

这里写描述
我做了一个定时任务,用来每天减少用户的day值。

程序代码或配置

任务类:
class DailyTask
{
    public function onWorkerStart()
    {
        new Crontab('0 0 * * *', function () {
            $data = Admin::where('day', '>', 0)->select('id')->get()->toArray();
            foreach ($data as $item) {
                Client::send('reduce-day', $item);
            }
            Log::info('执行每日任务:' . date('Y-m-d H:i:s') . '/数量:' . count($data));
        });

    }
}
在config/process.php中添加
 'dailyTask'  => [
        'handler'  => \app\process\DailyTask::class
    ],

对应创建了一个消费类
class ReduceDay implements Consumer
{
    // 要消费的队列名
    public $queue = 'reduce-day';

    // 连接名,对应 plugin/webman/redis-queue/redis.php 里的连接`
    public $connection = 'default';

    // 消费
    public function consume($data)
    {
        try {
            // 检查数据库连接是否可用
            Db::connection('plugin.admin.mysql')->select('SELECT 1');
        } catch (\Exception $e) {
            Db::connection('plugin.admin.mysql')->reconnect(); // 重新连接数据库
            Log::channel('queue')->info('数据库连接已断开,正在重连...');
        }
        Admin::where('id', $data['id'])->decrement('day');
    }

    public function onConsumeFailure(\Throwable $e, $package)
    {
        Log::channel('queue')->info('执行每日减日期失败');
        Log::channel('queue')->info($e->getMessage());
        Log::channel('queue')->info(json_encode($package, true));
    }
}

重现问题的步骤

结果,在实际的每天运行过程中都会报错:
2006 MySQL server has gone away
我最开始没有加入:
try {
// 检查数据库连接是否可用
Db::connection('plugin.admin.mysql')->select('SELECT 1');
} catch (\Exception $e) {
Db::connection('plugin.admin.mysql')->reconnect(); // 重新连接数据库
Log::channel('queue')->info('数据库连接已断开,正在重连...');
}

这串代码的时候,有时候他会减少掉,但有时候不会。
加入之后,虽然会每天减少了,但是还是依然会有报错。

操作系统环境及workerman/webman等具体版本

这里写具体的系统环境相关信息

Ubuntu 24.04
MySQL 5.7.44
Nginx 1.24.0
PHP-8.3

320 1 0
1个回答

walkor 打赏

webman/database 升级到最新版

  • siyuankeji 9天前

    我已经更新到最新版了,还是会时不时出现这个情况。我没有使用协程。然后,我的数据库配置如下:
    'default' => 'mysql',

    // 各种数据库配置
    'connections' => [
        'mysql' => [
            'driver' => 'mysql',
            'host' => '127.0.0.1',
            'port' => 3306,
            'database' => '',
            'username' => '',
            'password' => '',
            'unix_socket' => '',
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_general_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
            'options' => [
                PDO::ATTR_EMULATE_PREPARES => false, // 当使用swoole或swow作为驱动时是必须的
            ],
            'pool' => [ // 连接池配置
                'max_connections' => 500, // 最大连接数
                'min_connections' => 1, // 最小连接数
                'wait_timeout' => 3,    // 从连接池获取连接等待的最大时间,超时后会抛出异常。仅在协程环境有效
                'idle_timeout' => 60,   // 连接池中连接最大空闲时间,超时后会关闭回收,直到连接数为min_connections
                'heartbeat_interval' => 50, // 连接池心跳检测时间,单位秒,建议小于60秒
            ]
        ],
    ],
  • walkor 9天前

    执行 composer info | grep webman 发下 webman/database 版本

×
🔝