在 PHP 上实现“计划与任务”

在 PHP 上实现“计划与任务”

!本文为本站原创(bbs.jecat.cn),欢迎转载,请保留原站链接

今天有人在PHP技术群(38696114,北国冷群,非耐寒者慎入) 里讨论 php 如何实现定时执行任务,这个话题在群里面已经是第二次讨论了。干脆在 blog 里面做一下总结。

通常有3种方案:

1、利用服务器操作系统提供的定时功能,Linux/Unix 下使用 crontab , windows 下使用 “计划与任务”;

优点:稳定可靠

缺点:需要足够的权限,虚拟主机用户没有这个条件。

2、利用 Javascript 的 setInterval() 函数,在 网页上定时访问服务器端的 php 脚本。

优点:a.实现简单,入门级水准的 php 程序员即可;

   b.无需服务器 root/Administrator 权限。

缺点:不能网页关闭,所以不能做到真正的定时定点。

3、利用 ignore_user_abort() 循环访问自己,在服务器上保持一个持久的 php 进程,当时间到达时执行任务。

优点:a.无需服务器 root/Administrator 权限;

   b.完全依靠 php 自身,问题领域单一;

   c.完全无人值守,效果等同 Linux 的守护进程。

缺点:稳定性稍差,可能遇到意外挂掉。

在 3 个方案中,我最倾向于第3个, 稳定性稍差 的缺点倒是可以克服,好处在于 不需要 init.d/rc2.d 等目录的super write 权限,普通虚拟主机用户 一样兼顾; 同时也没有 方案2 中不能关浏览器的 变态缺陷。

关于 方案3 ,我没有现成的代码,临时写了一段伪码可供参考:

<?

// ignore_user_abort 允许即使 client 断开了TCP/HTTP链接 (client终止), 此 php 继续执行不会终止。

ignore_user_abort() ;

// 根据 max_execution_time 设置的最大执行时间循环

$nMaxExeTime = ini_get('max_execution_time')-1 ;

for($nSec=0;$nSec<$nMaxExeTime;$nSec++)

{

// 时间到!

if( time() == ... ... )

{

// To Do

// 该干嘛 干嘛

// ... ...

}

// 等到 下一秒

sleep(1) ;

}

// 结束前,启动自己的另一个进程

// -------------------------------------

// 作为 client 连到 server

fsocketopen() ;

// 遵循 http 协议发送访问自己的请求

fwrite('HTTP/1.1 Get ......') ;

// 不要 读取(fread), 发送请求后直接关闭 (fclose)

// 激流勇退 在 PHP 上实现“计划与任务” - ufo - 飞颖站点

fclose() ;

?>

阅读权限
200 
在线时间
72 小时 

查看详细资料

TOP

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值