2015-11-05 69 views
1

你好,我知道工匠调度程序是由cron调用的,并且crontab中的最小频率是“每分钟”如何以亚分钟频率实现Artisan/cron操作?

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

我敢打赌,已经有东西实现了服务器端例程频率高于60" 。 你知道任何真正的工作示例/实施,将实现我的问题的呢?

感谢

+1

为什么不问你面临的真正问题而不是你在这里写的内容?没有代码或实质性问题,我们可以抛出意见和猜测 - 这不是解决真正问题所需要的。 – Mjh

+0

是的,也许这个问题留下了太多的解释......我不认为我实际上需要一个意见,但一个工作示例的经验,没有性能缺陷... – koalaok

+0

我喜欢实现守护进程的想法,你会如何去做? (在PHP/laravel的风格:-)) – koalaok

回答

1

这假定操作不密集,他们会起飞任何真正的时间量,否则你的cron作业将重叠一个nd你会恨自己

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

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

[编辑]

票友版本检查运行时闭塞:

$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); 
} 
+0

是的,当我说“我可以通过软件(PHP)实现它”时,这是我想到的基本解决方案,但我确信它可能会变得很奇怪,很棒不保证如此快速......总是:) – koalaok

+0

是的,如果你需要每分钟运行超过20-30次的东西,你需要的东西不是PHP或cron。像NodeJS或Java这样的东西事件会更好地处理这个事情。我添加了一些可以减少碰撞可能性的检查。 –

+0

是的,我同意你的意见。谢谢 – koalaok