我有一个PHP脚本作为cron作业运行,它执行一组简单的任务,为数据库中的每个用户循环,大约需要30分钟才能完成.这个过程每小时开始一次,需要尽可能快速有效.我遇到的问题,就像任何服务器脚本一样,执行时间各不相同,我需要找出最佳的cron时间设置.
如果我每分钟运行一次cron,我需要在分钟结束前20秒停止脚本的最后一个循环,以确保当前循环及时完成.在一个小时的过程中,这会浪费很多时间.
假设您希望尽快完成工作,请不要使用cron. Cron适用于需要在特定时间发生的事情.它经常被滥用来模拟后台流程,这个流程一旦工作出现就会理想地处理工作.你应该写一个持续运行的守护进程. (注意:您还可以查看消息/工作队列类型系统,还有很好的库可以执行此操作)
您可以使用pcntl functions从头开始编写一个守护进程(因为您不关心多个工作进程,在后台运行进程是super-easy.),或作弊并创建一个永远运行的脚本并通过screen运行它,或利用一些像PEAR的System:Daemon或nanoserv这样的实体库代码
一旦守护进程得到处理,你真正关心的就是拥有一个永远运行的循环.您需要注意您的脚本不会泄漏内存或消耗太多资源.
通常,您可以执行以下操作:
<?PHP // some setup code while(true){ $todo = figureOutIfIHaveWorkToDo(); foreach($todo as $something){ //do stuff with $something //remember to clean up resources so you don't leak memory! usleep(/*some integer*/); } usleep(/* some other integer */); }
它会很好地工作.