php的计划任务 使用crontab

来源:互联网 发布:密码学 知乎 编辑:程序博客网 时间:2024/04/29 13:37

我们的PHP程序有时候需要定时执行,我们可以使用ignore_user_abort函数或是在页面放置js让用户帮我们实现。但这两种方法都不太可靠,不稳定。我们可以借助Linux的Crontab工具来稳定可靠地触发PHP执行任务。
下面介绍Crontab的两种方法。

一、在Crontab中使用PHP执行脚本

就像在Crontab中调用普通的shell脚本一样(具体Crontab用法),使用PHP程序来调用PHP脚本。
每一小时执行myscript.php如下:

  1. # crontab -e
  2. 00 * * * * /usr/local/bin/php /home/john/myscript.php

/usr/local/bin/php为PHP程序的路径。

二、在Crontab中使用URL执行脚本

如果你的PHP脚本可以通过URL触发,你可以使用lynx或curl或wget来配置你的Crontab。
下面的例子是使用Lynx文本浏览器访问URL来每小时执行PHP脚本。Lynx文本浏览器默认使用对话方式打开URL。但是,像下面的,我们在lynx命令行中使用-dump选项来把URL的输出转换来标准输出。

  1. 00 * * * * lynx -dump https://www.centos.bz/myscript.php

下面的例子是使用CURL访问URL来每5分执行PHP脚本。Curl默认在标准输出显示输出。使用”curl -o”选项,你也可以把脚本的输出转储到临时文件。

  1. */5 * * * * /usr/bin/curl -o temp.txt https://www.centos.bz/myscript.php

下面的例子是使用WGET访问URL来每10分执行PHP脚本。-q选项表示安静模式。”-O temp.txt”表示输出会发送到临时文件。

  1. */10 * * * * /usr/bin/wget -q -O temp.txt https://www.centos.bz/myscript.php
  

三:

windows计划任务

PHP很少在win服务器上跑,具体实现也不再深究,看网上实现的原理大概是写bat脚本,然后让window任务添加执行这个bat脚本,具体可以参考:http://www.cnblogs.com/whoknows/articles/2228577.html

linux 的脚本实现

这里主要使用到crontab这个命令,

使用方式 :

crontab   filecrontab [ -u user ] [ -u user ] { -l | -r | -e }

说明 :

crontab 是用来让使用者在固定时间或固定间隔执行程式之用

使用crontab写shell脚本,然后让PHP调用shell,这个是利用linux的特性,应该还不算PHP自身语言的特性

可以参看:http://www.centos.bz/2011/07/php-cron-job-linux-crontab/

PHP实现定时执行计划任务

使用php让浏览器刷新需要解决几个问题

  1. PHP脚本执行时间限制,默认的是30m 解决办法:set_time_limit();或者修改PHP.ini 设置max_execution_time时间(不推荐)
  2. 如果客户端浏览器关闭,程序可能就被迫终止,解决办法:ignore_user_abort即使关闭页面依然正常执行
  3. 如果程序一直执行很有可能会消耗大量的资源,解决办法使用sleep使用程序休眠一会,然后在执行

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
<?php
ignore_user_abort();//关掉浏览器,PHP脚本也可以继续执行.
set_time_limit(3000);// 通过set_time_limit(0)可以让程序无限制的执行下去
$interval=5;// 每隔5s运行
 
//方法1--死循环
do{
    echo'测试'.time().'<br/>';
    sleep($interval);// 等待5s   
}while(true);
 
//方法2---sleep 定时执行
    require_once'./curlClass.php';//引入文件
     
    $curl= new httpCurl();//实例化
    $stime= $curl->getmicrotime();
    for($i=0;$i<=10;$i++){
         
        echo'测试'.time().'<br/>';
        sleep($interval);// 等待5s
         
    }
    ob_flush();
    flush();
    $etime= $curl->getmicrotime();
    echo'<hr>';
    echoround(($etime-stime),4);//程序执行时间
1
  

测试的时候发现这个效率并不是很高,

QQ截图20111216110444

总结:

个人感觉PHP定时执行任务的效率不是很高,建议关于定时执行任务的工作还是交给shell来做吧,比较那才是王道。

ps:那个死循环的方法好像是恶意攻击网站经常使用的方法


阅读全文
1 0