php定时执行任务
由于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;
[*]$min=$runT;
[*]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
页:
[1]