webman,定时任务,奇怪现象

evilk

1.
config/app.php

return [
    'debug' => true,
    'default_timezone' => 'Asia/Shanghai',
];

2.
process/test.php(每天早上10点 和 11点,这样是可以准时执行的,查看对应的日志,有内容输出)

public function onWorkerStart(Worker $worker)
{
        $workerId = $worker->id;

        new Crontab('0 0 10,11 * * *', function () use ($workerId) {
            echo date('Y-m-d H:i:s') . PHP_EOL;
        });
}

3.
但如果把定时任务换成如下(每天凌晨1点 和 每天凌晨4点)
定时任务就不会执行

public function onWorkerStart(Worker $worker)
{
        $workerId = $worker->id;

        new Crontab('0 0 1,4 * * *', function () use ($workerId) {
            echo date('Y-m-d H:i:s') . PHP_EOL;
        });
}

4.

  • 昨天下午下班后,任务时间设置为 0 0 1,4 * * *,启动服务,今天早上发现没有对应的日志输出
  • 然后,调整定时任务执行时间为 0 0 10,11 * * *,然后 restart 服务
  • 早上10点 和 早上11点,分别有对应的日志输出
  • 连续两天,都是这样测试的
  • 百思不得其解
1596 2 0
2个回答

yzh52521
 0 10,11 * * *

这是10点11点

 0 1,4 * * *

这是 1点4点

  • Tinywan 2022-04-08

    O(∩_∩)O哈哈~

  • evilk 2022-04-08

    下班之前,定时任务,设置为 0 0 1,4 * * *,启动服务,早上来公司,发现没有日志输出
    然后,再调整为0 10,11 * * *,早上10点 和 早上11点,有日志输出
    这就有问题了啊
    为啥凌晨的任务没有执行呢

  • iqige 2022-04-08

    0 0 1,4 * 这个不是凌晨1点和4点,看上面

  • evilk 2022-04-09

    请问大佬
    为什么设置为 new Crontab('0 1,4 * * *',在凌晨1点 和 凌晨4点,依然没有执行呢?

  • czf 2022-04-09

    定时任务的执行规则,在分钟级的定义时,与 Linux 的 crontab 命令的规则一致,在秒级的定义时,规则长度从 5 位变成 6 位,在规则的前面增加了对应秒级的节点,也就是 5 位时以分钟级规则执行,6 位时以秒级规则执行,如 /5 则代表每 5 秒执行一次。注意在注解定义时,规则存在 \ 符号时,需要进行转义处理,即填写 \/5

evilk

为什么设置为 new Crontab('0 1,4 * * *',在凌晨1点 和 凌晨4点,依然没有执行呢?

  • Tinywan 2022-04-09

    先学习一下crontab表达式:https://www.runoob.com/linux/linux-comm-crontab.html

  • evilk 2022-04-09

    看了一下,这个表达式是没问题的,只是没数据,所以没有日志输出,谢谢大佬

  • Tinywan 2022-04-09

    你日志输出是写入日志文件,还是在终端输出的

  • evilk 2022-04-09

    写入日志的,是这样的

    Db::table(CustomerModel::$table)
                        ->where(CustomersEntity::TBC_star_balance, '>', 0)
                        ->select([CustomersEntity::TBC_id, CustomersEntity::TBC_level_id])
                        ->chunkById(10000, function ($customers) {
                            /**
                             * 通过队列处理,启动多个消费者,提高处理速度
                             */
                            Client::send((new CheckCustomerLevelConsumer())->queue, json_encode(['customers' => $customers]));
                        });

    因为没有符合条件的结果,所以永远不会走到回调函数内,所以不会发送数据到队列里
    我在队列里,把接收到的数据,写入日志

  • Tinywan 2022-04-09

    你最好是移除掉你的业务逻辑,直接使用系统自带日志系统Log(Log::info('xxxxxxxxxxxx')),尝试记录日志。先排查是不是定时任务插件的问题。继而排查业务问题。(初步判断是你业务和队列有问题)

  • evilk 2022-04-09

    是的
    就打算这样排查
    谢谢大佬

年代过于久远,无法发表回答
🔝