聊聊php定时计划任务

简介:

google百度了下,PHP任务大体上可以分为三类


1、服务器计划任务

WIN服务器可以直接使用定时任务执行相关的应用程序,LINUX服务器则可以通过在/etc/crontab里添加定时任务来实现。


2、通过死循环实现任务自动执行

建立一个程序文件页面,通过ignore_user_abort来设置关闭浏览器页面后仍可执行,那么,在运行该程序页面后,您所需要的任务计划便会一直自动执行。对于一般的PHP程序员来说,如果没有足够的把握,这种操作是不被允许的,因为死循环极容易使用服务器当机。


3、触发式定时任务

在我所了解的几套程序中,像Discuz、帝国CMS等等,均使用这种方式来完成系统的定时任务,相对前面的两种方法,这是最为安全和简单的。


Discuz:

在您设置的计划任务执行时刻,如果有人访问您的站点,计划任务才会执行;如果那个时刻没有人访问您的站点,一直到有人访问时才执行计划任务。





定时任务对于php来说一直都是很多朋友的一个难题,但却很多地方都遇到了。
比如说:
游戏开发程序中,每隔10分钟给玩家发兵一次
sns社区中每隔20秒检测一下是否有人给我发消息
自动采集程序,每隔5分钟采集一次最新内容
微博数据同步,每隔10个小时通过微博api接口同步一次用户数据
……

大概有那么几种方法:
1.Linux系统
定时直接可以用cron来执行一个php脚本 或者其他语言的脚本[你要有足够的系统权限]
执行编辑cron命令

1
crontab -e

比如每隔5分钟执行下 /root/bin目录下的test.php脚本

*/5 * * * * php /root/bin/test.php

2.windows系统
可用计划任务执行脚本,不举例





PHP的实现决定了它没有Java和.Net这种AppServer的概念, 而http协议是一个无状态的协议, php只能被用户触发, 被调用, 调用后会自动退出内存, 没有常驻内存, 就没有办法准确的定时处理

那么, 如果需要用PHP定时执行某些任务的话, 可以有以下几个方法:


1、Linux下crontab, windows下计划任务

2、找个被频繁调用的网页, 里面加上一个检测代码

3、set_time_limit(0);

ignore_user_abort(true);

死循环


第一种:方法是最常见的, 但也是最靠谱的,如果php服务器上没有权限去crontab, 也可以找一个自己的机器定期crontab去请求服务器

第二种:方法, 论坛上定时清理新帖基本上就是这么实现的, 如果人气不旺的话, 可以考虑去别的火爆点的论坛里面发个图片, 调用自己的php来实现一个trigger就好了。 Discuz!是判断在00:00之后,第一个执行者去执行的。

第三种:最不靠谱, Apache重启了就得重新访问,  fastcgi倒是会好一点。




网上参考:

http://blog.163.com/zbstrive_work@126/blog/static/165378687201141143512114/



      本文转自许琴 51CTO博客,原文链接:http://blog.51cto.com/xuqin/1369169,如需转载请自行联系原作者




相关文章
|
9月前
|
Linux API PHP
php定时将API中的数据每N分钟同步录入数据库的解决方案
php定时将API中的数据每N分钟同步录入数据库的解决方案
66 0
|
移动开发 前端开发 JavaScript
PHP定时更新数据库,定时器,定时任务详细讲解(通过前端触发)
PHP定时更新数据库,定时器,定时任务详细讲解(通过前端触发)
624 0
|
移动开发 Linux PHP
PHP实现执行定时任务的几种思路详解
转:https://segmentfault.com/a/1190000002955509 PHP本身是没有定时功能的,PHP也不能多线程。PHP的定时任务功能必须通过和其他工具结合才能实现,例如WordPress内置了wp-cron的功能,很厉害。
2630 0
|
PHP
【PHP】定时计划没有执行PHP脚本以及解决方案
问题 cron 定时触发任务,但是始终没有执行,并且在/var/log/cron里也没有对应的日志产生,并且也在php-fpm的日志文件下也没有错误日志产生。 分析&&解决 cron没有执行? 并没有 : ( service crond status crond (pid 5467) is running.
857 0
|
监控 Shell PHP
redis+crontab+php异步处理任务
2016年1月8日 16:08:43 星期五 情景: 用户登录日志, 发邮件, 发短信等等实时性要求不怎么高的业务通常会异步执行 之前接触过几种redis+crontab配套的实现方法, 比如: crontab定时执行curl脚本   1.
1250 0