定时任务对于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系统
可用计划任务执行脚本,不举例

3.如果没有系统权限,那就往下看吧。
由于php属于解释型弱语言,所以做定时任务的时候不会像java那样容易,在java中直接给个进程就可以让系统执行定时任务,但是在php中没那么简单 设置都没有多线程的概念。

我第一次接触定时任务的时候是一个做php的朋友问我怎么实现定时发兵,我当时给出的答案是写一个包含文件,每次都执行的时候都调用这个文件检查是否有任务,但试想 如果没人触发怎么办,显然答案并不完美。

后来我又通过其他渠道获得了解决的最佳办法,而且我还亲自做了测试。
大致理念就是设定关闭浏览器程序也会停留在服务器内存中执行,并且相应时间永不过期
看程序:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

ignore_user_abort(TRUE); // 设定关闭浏览器也执行程序

set_time_limit(0);       // 设定响应时间不限制,默认为30秒

$count  = 0;

while  (TRUE)

{

     sleep(5);            // 每5秒钟执行一次

     // 写文件操作开始

     $fp  =  fopen ( "test" . $count . ".txt" "w" );

     if ( $fp )

     {

         for ( $i =0;  $i <5;  $i ++)

         {

             $flag =fwrite( $fp , $i . "这里是文件内容www.uacool.com\r\n" );

             if (! $flag )

             {

                 echo  "写入文件失败" ;

                 break ;

             }

         }

     }

     fclose( $fp );

     // 写文件操作结束

     $count ++;

     // 设定定时任务终止条件

     if  ( file_exists ( 'lock.txt' ))

     {

         break ;

     }

}

把这个文件命名为 tast.php 放在网站根目录
如: www.uacool.com/tast.php
访问此网页。此程序会再网站根目录不断生成名为test0.txt,test1.txt,test2.txt…的文本文件
访问后可关闭浏览器,不影响程序继续执行,如想阻止程序,请在网站根目录下放一个名为lock.txt的文件。
如:www.uacool.com/lock.txt
当然重新启动服务器或者重启电脑也可以阻止程序继续运行

相关内容:
windows的schtasks定时任务:https://baitexiaoyuan.oss-cn-zhangjiakou.aliyuncs.com/updatecrm/php/20230915/2223166.html

Cron服务是SAE为开发者提供的分布式定时服务:https://baitexiaoyuan.oss-cn-zhangjiakou.aliyuncs.com/updatecrm/php/20230915/signin.php

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部