Home > php教程 > php手册 > body text

php定时执行任务实现方法详解

WBOY
Release: 2016-05-25 16:39:51
Original
1075 people have browsed it

每个PHP脚本都限制了执行时间,所以我们需要通过 set_time_limit 来设置一个脚本的执行时间为无限长,然后使用 flush() 和 ob_flush() 来清除服务器缓冲区,随时输出脚本的返回值,当我们执行后,每隔5秒钟,我们会得到一行 Hello World,代码如下:

<?php
header("Content-Type: text/plain");
set_time_limit(0);
$infoString = "Hello World" . "\n";
while (isset($infoString)) {
    echo $infoString;
    flush();
    ob_flush();
    sleep(5);
}
?>
Copy after login

例,代码如下:

<?php
ignore_user_abort(); // 即使Client断开(如关掉浏览器),PHP脚本也可以继续执行.
set_time_limit(0); // 执行时间为无限制,php默认的执行时间是30秒,通过set_time_limit(0)可以让程序无限制的执行下去
$interval = 20; // 时间间隔 单位 秒
$key_file = "key.txt"; // 配置文件
if (isset($_GET[&#39;s&#39;])) {
    if ($_GET[&#39;s&#39;] == "0") { // 停止工作,但不退出
        $s = "false";
        echo "Function is off";
    } elseif ($_GET[&#39;s&#39;] == "1") { // 工作
        $s = "true";
        echo "Function is on";
    } elseif ($_GET[&#39;s&#39;] == "2") { // 退出
        $s = "die";
        echo "Function exited";
    } else die("Err 0:stop working 1:working 2:exit");
    $string = "<?php\n return "".$s."";\n";
    write_inc($key_file, $string, true);
    exit();
}
if (file_exists($key_file)) {
    do {
        $mkey = include $key_file;
        if ($mkey == "true") { // 如果工作
            /////////////////////  工作区间  //////////////////////////////////
            $showtime = date("Y-m-d H:i:s");
            $fp = fopen(&#39;func.txt&#39;, &#39;a&#39;);
            fwrite($fp, $showtime . "n");
            fclose($fp);
            ///////////////////////////////////////////////////////////////////
            
        } elseif ($mkey == "die") { // 如果退出
            die("I am dying!");
        }
        sleep($interval); // 等待$interval分钟
        
    } while (true);
} else die($key_file . " doesn&#39;t exist !");
function write_inc($path, $strings, $type = false) {
    $path = dirname(__FILE__) . "/" . $path;
    if ($type == false) file_put_contents($path, $strings, FILE_APPEND);
    else file_put_contents($path, $strings);
}
?>
Copy after login

个人觉得在php定时执行任务还是有点复杂并且不好使用,下面我来介绍在操作系统中计划任务来实现,在网上找了些WINDOWS执行PHP的计划任务的方法,有一个写得很全,可惜在我这竟然没通过,最后不得不综合各门派的方法,才能在我这运行成功.

1、写一个PHP程序,命名为test.php,内容如下所示:

<?php
$fp = fopen("test.txt", "a+");
fwrite($fp, date("Y-m-d H:i:s") . " 成功成功了!\n");
close($fp);
?>
Copy after login

程序大胆地写,什么includerequire尽管用,都没问题.

2、新建Bat文件,命名为test.bat,内容如下所示:

D:\php\php.exe -q D:\websitetest.php
Copy after login

相应目录自己改上.

3、建立WINDOWS计划任务:

开始–>控制面板–>任务计划–>添加任务计划,浏览文件夹选择上面的bat文件,设置时间和密码(登陆WINDOWS的)保存即可了.

4、over,可以右键计划任务点"运行"试试.

linux系统:

我们可以借助Linux的Crontab工具来稳定可靠地触发PHP执行任务,下面介绍Crontab的两种方法.

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

就像在Crontab中调用普通的shell脚本一样,具体Crontab用法,使用PHP程序来调用PHP脚本.

每一小时执行myscript.php如下:

# crontab -e
2.00 * * * * /usr/local/bin/php /home/john/myscript.php
/usr/local/bin/php
Copy after login

为PHP程序的路径.

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

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

1.00 * * * * lynx -dump /myscript.php
Copy after login

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

1.*/5 * * * * /usr/bin/curl -o temp.txt /myscript.php

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

1.*/10 * * * * /usr/bin/wget -q -O temp.txt /myscript.php
Copy after login

                                   


Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Recommendations
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!