这里写描述
我做了一个定时任务,用来每天减少用户的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('数据库连接已断开,正在重连...');
}
这串代码的时候,有时候他会减少掉,但有时候不会。
加入之后,虽然会每天减少了,但是还是依然会有报错。
这里写具体的系统环境相关信息
Ubuntu 24.04
MySQL 5.7.44
Nginx 1.24.0
PHP-8.3
webman/database 升级到最新版
我已经更新到最新版了,还是会时不时出现这个情况。我没有使用协程。然后,我的数据库配置如下:
'default' => 'mysql',
执行 composer info | grep webman 发下 webman/database 版本