欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

关于PHP定时执行任务的实现

shiping1 的头像

PHP定时执行的三种方式实现

1、windows 的计划任务 
2、linux的脚本程序 
3、让web浏览器定时刷新

 

    具体实现

    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

      使用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>';
          echo round(($etime-stime),4);//程序执行时间
      1
       

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

      QQ截图20111216110444

      总结:

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

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


      来自 http://www.cnblogs.com/phphuaibei/archive/2011/12/16/2290574.html
      PHP在这方面应该说是比较弱,如果只用php去实现可以如下:

      
      
      1. <?php
      2. ignore_user_abort();//关闭浏览器后,继续执行php代码
      3. set_time_limit(0);//程序执行时间无限制
      4. $sleep_time = 1;//多长时间执行一次
      5. do{
      6. $fp = fopen('test.txt','a+');
      7. fwrite($fp,"这是一个php博客:phpddt.com \n");
      8. fclose($fp);
      9. sleep($sleep_time);
      10. }while(true);
      11.  
      12. ?>

      但是当我执行脚本的时候,即使我关闭了浏览器,我根本就没法去停止这段程序了,所以你需要一个执行脚本的开关,你可以用外部文件引入的方法来实现,在while循环的时候,include开关变量即可。那么就可以这样实现:

      建立外部引入变量文件 switch.php  内容如下:

      <?php

      return 1;//1执行脚本 0退出执行脚本

      ?>

      改良脚本如下:


      
      
      1. <?php
      2. ignore_user_abort();//关闭浏览器后,继续执行php代码
      3. set_time_limit(0);//程序执行时间无限制
      4. $sleep_time = 5;//多长时间执行一次
      5. $switch = include 'switch.php';
      6. while($switch){
      7. $switch = include 'switch.php';
      8. $fp = fopen('test.txt','a+');
      9. fwrite($fp,"这是一个php博客:phpddt.com $switch \n");
      10. fclose($fp);
      11. sleep($sleep_time);
      12. }
      13. exit();
      14.  
      15. ?>

      这个脚本只是测试可行,具体效率应该不高,对于lamp,你完全可以使用crontab 来实现,这个我会后期贴出教程

      来自 http://www.phpddt.com/php/php-timed-task.html

       

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

      来源:   时间:2013-09-05 19:27:01   阅读数:83350

      分享到:2

      [导读] 本文章来给大家总结了一些常用的关于在php定时执行任务实现方法详解,包括直接利用php来操作,还有使用操作系统的计划任务来操作,有需要了解的同学可参考。每个PHP脚本都限制了执行时间,所以我们需要通过 se

      本文章来给大家总结了一些常用的关于在php定时执行任务实现方法详解,包括直接利用php来操作,还有使用操作系统的计划任务来操作,有需要了解的同学可参考。

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

       代码如下复制代码

      header("Content-Type: text/plain");
      set_time_limit(0);

      $infoString = "Hello World" . "n";
      while( isset($infoString) )
      {
      echo $infoString;
      flush();
      ob_flush();
      sleep(5);
      }

       代码如下复制代码

      <?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['s'])) 

        if ($_GET['s']=="0"){        // 停止工作,但不退出 
          $s="false"; 
          echo "Function is off"; 
        } 
        elseif ($_GET['s']=="1"){      // 工作 
          $s="true"; 
          echo "Function is on"; 
        } 
        elseif ($_GET['s']=="2"){      // 退出 
          $s="die"; 
          echo "Function exited"; 
        } 
        else 
          die("Err 0:stop working 1:working 2:exit"); 
        $string = "<?phpn 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('func.txt','a'); 
            fwrite($fp,$showtime."n"); 
            fclose($fp); 
          /////////////////////////////////////////////////////////////////// 
          } 
          elseif ($mkey=="die"){        // 如果退出 
            die("I am dying!"); 
          } 
          sleep($interval);           // 等待$interval分钟 
        }while(true); 

      else 
        die($key_file." doesn'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); 

      ?>

      个人觉得在php定时执行任务还是有点复杂并且不好使用,下面我来介绍在操作系统中计划任务来实现。

      在网上找了些WINDOWS执行PHP的计划任务的方法,有一个写得很全,可惜在我这竟然没通过。最后不得不综合各门派的方法,才能在我这运行成功。

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

       代码如下复制代码

       <?

       $fp = fopen("test.txt", "a+");

       fwrite($fp, date("Y-m-d H:i:s") . " 成功成功了!n");

      fclose($fp);

       ?>

      程序大胆地写,什么includerequire尽管用,都没问题
      2、新建Bat文件,命名为test.bat,内容如下所示:

       代码如下复制代码

       D:phpphp.exe -q D:websitetest.php

      //相应目录自己改上

      3、建立WINDOWS计划任务:
      开始–>控制面板–>任务计划–>添加任务计划
      浏览文件夹选择上面的bat文件
      设置时间和密码(登陆WINDOWS的)

      保存即可了。
      4、over! 可以右键计划任务点“运行”试试


      linux系统中


      我们可以借助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 /myscript.php

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



      来自  http://www.php100.com/html/php/lei/2013/0905/5376.html


      普通分类: