我有一个php脚本作为cron作业运行,它执行一组简单的任务,为数据库中的每个用户循环,大约需要30分钟才能完成.这个过程每小时开始一次,需要尽可能快速有效.我遇到的问题,就像任何服务器脚本一样,执行时间各不相同,我需要找出最佳的cron时间设置.
如果我每分钟运行一次cron,我需要在分钟结束前20秒停止脚本的最后一个循环,以确保当前循环及时完成.在一个小时的过程中,这会浪费很多时间.
我想知道是否一个坏主意简单地删除php执行时间限制并每小时运行一次脚本并让它运行完成....这是一个坏主意吗?
假设您希望尽快完成工作,请不要使用cron.Cron适用于需要在特定时间发生的事情.它经常被滥用来模拟一个后台流程,一旦工作出现就会理想地处理工作.您应该编写一个持续运行的守护程序.(注意:您还可以查看消息/工作队列类型系统,还有很好的库也可以这样做)
您可以使用pcntl函数从头开始编写一个守护进程(因为您不关心多个工作进程,在后台运行进程非常容易.),或者欺骗并创建一个永远运行并运行的脚本它通过屏幕,或利用一些坚实的库代码,如PEAR的系统:守护进程或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 */);
}
Run Code Online (Sandbox Code Playgroud)
它会很好地工作.
除了设置,max_execution_time还可以使用set_time_limit()在每个循环上重置计数器。这将确保您的脚本永远不会用完时间,除非当前循环中有严重的问题(并且花费的时间超过了max_execution_time)。
基本上,这应该使您的脚本可以根据需要运行,同时在两次set_time_limit()调用之间为它提供30秒的超时时间。