[定时任务]Laravel框架秒级定时任务最好的实现方式求大神们推荐?

我司有一个定时抽奖的需求,就是按照时间自动开奖的那种,Laravel框架现有的定时任务都是到分钟一级的,如果要实现秒级的话,怎样实现才是最合理的呢?

php_tb
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

简单的实现方式,就是每分钟执行一次,脚本内循环执行60次,每秒一次

function handle()
{
    for($i = 0; $i < 60; $i++) {
        ....
        sleep(1);
    }
}
2年前 评论
讨论数量: 18

既然执行时间是确定的,那每分钟执行一次,计算当前时间在这一分钟内,然后sleep。哈哈哈哈

2年前 评论
playmaker 2年前
Complicated

最简答的就是 写个artisan命令,里边写个 while循环,然后 用superidor(打错了,是个守护进程)守护起来就好了

2年前 评论

简单的实现方式,就是每分钟执行一次,脚本内循环执行60次,每秒一次

function handle()
{
    for($i = 0; $i < 60; $i++) {
        ....
        sleep(1);
    }
}
2年前 评论
chowjiawei

job delay到你要的时间

2年前 评论

一直想不明白,什么需求,需要秒级定时任务 这么夸张吗?

2年前 评论
playmaker 2年前
Complicated 2年前

直接写 artisan 命令,不用定时

function handle() {
    workPerSec(function() {
        // do something
    });
}

function workPerSec($callback) {
    $startTime = microtime(true) * 1e6;
    while (true) {
        $callback();
        $startTime += 1e6;
        usleep(max($startTime-microtime(true) * 1e6, 0));
    }
}
2年前 评论

可插入redis队列 ,比如插入 lpush('TASK', json_encode(['id'=>$id,'time'=>$time]))。用 laravel 的 command 加 supervisor 守护,while 循环,每秒钟 rpop 一个,到了时间就消费,没到时间重新 lpush 进去。或者用 swoole 的 timer 定时也行,不太建议用,上面方案是比较稳妥的,我的两个项目都是这么弄的。

2年前 评论

用swoole 写个定时器

2年前 评论

artisan 写个死循环 supervisor守护

2年前 评论

目前项目用的是swoole定时器

2年前 评论
while (true) {
    shell_exec("php xxx > /dev/null 2>&1 &");
    sleep(1);
}

稳定无BUG还不会堵塞

2年前 评论

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