在 PHP 上实现“计划与任务” !本文为本站原创(bbs.jecat.cn),欢迎转载,请保留原站链接 今天有人在PHP技术群(38696114,北国冷群,非耐寒者慎入) 里讨论 php 如何实现定时执行任务,这个话题在群里面已经是第二次讨论了。干脆在 blog 里面做一下总结。 通常有3种方案: 1、利用服务器操作系统提供的定时功能,Linux/Unix 下使用 crontab , windows 下使用 “计划与任务”; 优点:稳定可靠 缺点:需要足够的权限,虚拟主机用户没有这个条件。 2、利用 Javas 优点: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) // 激流勇退 fclose() ; ?> | |
| TOP |