最新消息:网站改版咯

php定时执行任务

php Yovae 1085浏览

由于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);
			}
		}
	}
}
}

 

转载请注明:Yovae Studio » php定时执行任务