由于php是单线程的,没有和其它语言一样可以开出多个线程互相调用,所以如果要实现php定时执行任务就需要一点技巧,这里说的是不使用系统自带的计划任务。
我可以利用一个死循环就是while(1){}来无限重复,这里就有几个问题了。
1.php脚本运行时间有限制,骑士要解决超时问题很简单,直接用set_time_limit();这样就不会限制脚本执行时间了。
2.php在用户页面请求关闭后就会结束程序释放资源,为了不然定时任务不受页面请求的影响这里可以用ignore_user_abort();忽略用户取消请求。
3.解决上诉问题后还有问题就是,while(1){}这样搞下去会不会很耗资源?没错,不过有办法,不到时间的时候让程序"睡"一会,用sleep();
解决上面问题后我们就可以编写php定时执行任务的脚本了.当然作为程序员要尽可能地去优化代码的性能。我们可以在while(1){}里面根据时间来判断最大睡眠时间,这样就可以保证程序准时又相对节约资源。我写了个例子,本人保留代码所有权:
- /**
- +------------------------------------------------------------------------------
- * 定时执行计划任务
- +------------------------------------------------------------------------------
- * @param $runTime 指定程序运行时间
- * @author Yovae <yovae@qq.com>
- * @version 1.0 2011-6-3
- +------------------------------------------------------------------------------
- */
- function plane($runTime)
- {
- $runT=explode(":",$runTime);
- $hour=$runT[0];
- $min=$runT[1];
- if($hour=="00")
- {
- $hour=24;
- }
- else
- {
- $hour=intval($hour);
- }
- if($min=="00")
- {
- $min=0;
- }
- else
- {
- $min=intval($min);
- }
- while(1)
- {
- ...... //这里插入要定时运行的脚本
- while(1)//开始监测时间 定时执行 startPrintWaterMark()
- {
- if(date('H:i')==$runTime)
- {
- break;
- }
- else
- {
- $waitHour=intval(abs(intval(date('H'))-$hour));
- if($waitHour==0)
- {
- $waitMin=intval(abs($min-intval(date('i'))));
- if($waitMin>1)
- {
- sleep(($waitMin-1)*60);
- }
- }
- else
- {
- sleep($waitHour*3600);
- }
- }
- }
- }
- }
- 转自:http://www.yovae.com/blog/php
更多文章
欢迎访问更多关于消息中间件的原创文章:
- RabbitMQ系列之消息确认机制
- RabbitMQ系列之RPC实现
- RabbitMQ系列之怎么确保消息不丢失
- RabbitMQ系列之基本概念和基本用法
- RabbitMQ系列之部署模式
- RabbitMQ系列之单机模式安装
关注微信公众号
欢迎大家关注我的微信公众号阅读 更多 原创文章: