Heim > php教程 > php手册 > Hauptteil

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

WBOY
Freigeben: 2016-05-25 16:39:51
Original
1079 Leute haben es durchsucht

每个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);
}
?>
Nach dem Login kopieren

例,代码如下:

<?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);
}
?>
Nach dem Login kopieren

个人觉得在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);
?>
Nach dem Login kopieren

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

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

D:\php\php.exe -q D:\websitetest.php
Nach dem Login kopieren

相应目录自己改上.

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
Nach dem Login kopieren

为PHP程序的路径.

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

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

1.00 * * * * lynx -dump /myscript.php
Nach dem Login kopieren

下面的例子是使用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
Nach dem Login kopieren

                                   


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage