如何以次分钟频率实现Artisan / cron操作?

时间:2015-11-05 14:41:32

标签: php laravel cron scheduling frequency

您好我知道Artisan调度程序是由cron调用的,而crontab中的最小频率是"每分钟"

如何获得更高的频率? 我可以通过软件(PHP)来实现它:就像每分钟调用脚本一样,但脚本本身会定时其他子操作? 或者更好我可以通过bash脚本实现它(可能总是通过cron调用...但是会在每分钟内调用多个调用,进程正在监视/垃圾回收)

我敢打赌已经有了实现频率高于60"的服务器端例程的东西。 您是否知道任何可以实现我的问题的实际工作示例/实现?

由于

1 个答案:

答案 0 :(得分:1)

这假设操作不是密集的,他们会花费任何实际的时间,否则你的cron工作会重叠,你会讨厌自己

$times_per_minute = 10;
for($i=0; $i<$times_per_minute; $i++) {
    do_my_awesome_function();
    sleep(60/$times_per_minute);
}

然后安排你的cron作业是每分钟运行上面的代码。

[编辑]

a fancier版本检查运行时阻塞:

 $start_time = time(); 
 $times_per_minute = 10;
 for($i=0; $i<$times_per_minute; $i++) {
        do_my_awesome_function();
        $actual_runtime = time() - $start_time;
        $predicted_runtime = $i * (60/$times_per_minute);
        $offset_time = $predicted_runtime - $actual_runtime;
        sleep((60 - $offset_time)/$times_per_minute);
 }

一个更加漂亮的版本可以测试是否有足够的时间再次运行循环:

 $start_time = time(); 
 $times_per_minute = 10;
 for($i=0; $i<$times_per_minute; $i++) {
        if($i > 0) {
            $average_run_time = (time() - $start_time) / $i
            if(time() - $start_time + $average_run_time > 60) {
                break;
            }
        }
        do_my_awesome_function();
        $actual_runtime = time() - $start_time;
        $predicted_runtime = $i * (60/$times_per_minute);
        $offset_time = $predicted_runtime - $actual_runtime;
        sleep((60 - $offset_time)/$times_per_minute);
 }