0 条评论
13 Feb 2012

php定时计划常用实现方法

我需要一个办法,可以每天定时执行网站上的php脚本。php本身并没有提供这样的函数,于是我在网上找到3种“php计划任务的实现方案”。

第一种
利用操作系统的一些命令,如linux的“crond” 实现。这种方法最简单可行,但是需要你有足够的权限。我的网站是租用的虚拟空间,所以pass。

第二种
写一个php程序,获得当前时间,然后用当前时间与设定时间对比,如果当前时间比设定时间大,就会执行一些脚本。将php程序放入每一个网页中,这样只要有用户访问网站,就会执行这个php程序,变相的实现计划任务。
我们考虑一个极端情况:如果这个网站万年没人访问(或者网站本来就是有特殊目的的,比如me),计划任务不久挂了吗?pass

第三种
初次看这个方案,一股非主流的气息扑面而来。
php有一个ignore_user_abort()函数,可以保证网页断开,php脚本继续执行。配合set_time_limit(0),可以让脚本无时间限制执行。于是有以下代码:

ignore_user_abort(); //即使Client断开(如关掉浏览器),PHP脚本也可以继续执行.
set_time_limit(0); // 执行时间为无限制,php默认的执行时间是30秒,通过set_time_limit(0)可以让程序无限制的执行下去
$interval=5; // 每隔5秒运行
do{
//你的事务放这里
//你的事务放这里
//你的事务放这里
sleep($interval); // 等待5秒
}while(true);//死循环保证程序永远执行

我将以上代码放入网站里面运行,不久我就后悔了。因为脚本根本无法手动停止,即使你将php文件删除。我只能将apache重启。后来我修改了这个代码:
<?php
ignore_user_abort
(); //即使Client断开(如关掉浏览器),PHP脚本也可以继续执行.
set_time_limit(0); // 执行时间为无限制,php默认的执行时间是30秒,通过set_time_limit(0)可以让程序无限制的执行下去
$interval=5// 每隔5秒运行
do{
//你的事务放这里
//你的事务放这里
//你的事务放这里
sleep($interval); // 等待5秒
exeStop();//若符合条件,停止
}while(true);//死循环保证程序永远执行
//这个函数检查目录中有没有"exeStop"这个文件。如果有,则停止程序。
//也就是说,如果你想要停止程序。只要在目录下建一个文件"exeStop"。
function exeStop()
{
$fileName="exeStop";
if(
file_exists($fileName))
{
//根据网上资料,以下5行任何一行都能kill掉这个进程。
//但是我被这个程序吓怕了,多带点符防鬼。
ignore_user_abort(false);
set_time_limit(10);
ob_end_flush();
echo 
"STOP";
exit();
}
}
?>

ok,如果以上的实验成功,就不会有今天的文章了。我用这个代码每隔几秒做一件事情,一点事都没有。但是我让它每天自动发送一封邮件,这位快递只干了一次活,第二天就抄了我的鱿鱼。可能是虚拟空间有某种程序,会kill掉长期存在的进程,或者服务器会在我们睡觉的时候重启。总之,这个方案失败(非主流果然不可靠)。pass

据说mysql有计划执行任务的功能,我不太了解。我想到了另外一个更加非主流的方法。
假设我的笔记本永远开机,我就能让它在固定时间连接网站上的php程序,实现计划任务。我的笔记本当然不可能永远开机,但是我可以让我的手机完成这个事情。我的手机是android系统,我查找了一些资料。我可以让android手机定时打开gprs,连接网站上的php文件,关闭gprs。ok,计划任务成功。

此方案待实验。

源文出处 http://blog.sina.com.cn/s/blog_5bc6187c0100rkmu.html

相关日志

添加新评论