美文网首页
使用PHP代码实现计划任务

使用PHP代码实现计划任务

作者: 云龙789 | 来源:发表于2018-09-03 11:51 被阅读25次

    PHP本身是没有定时功能的,这主要是因为PHP无法实现多线程。所谓多线程,就是你写一个php文件,可以在访问它时,同时完成多个任务,实际上,php是从上往下顺序执行的,执行过程中没有办法分支执行。PHP的定时任务功能必须通过和其他工具结合才能实现,可能一般都会使用crontab

    对了,虽然php没有多线程,但是它有PHP-FPM FastCGI 进程管理器 PHP FastCGI Process Manager,推荐阅读深入剖析 Web 服务器与 PHP 应用之间的通信机制 – 掌握 CGI 和 FastCGI 协议的运行原理

    自写脚本其实主要运用到了ignore_user_abort(true)自带函数,意思是客户端终端链接的时候,脚本还会继续执行。注意,必须在浏览器访问才可以生效,而不能直接在终端执行脚本

    ignore_user_abort(true);
    set_time_limit(0);
    
    
    <?php
    
    ignore_user_abort(true);
    set_time_limit(0);
    date_default_timezone_set('PRC'); // 切换到中国的时间
    $run_time = strtotime('+1 day'); // 定时任务第一次执行的时间是明天的这个时候
    $interval = 3600*12; // 每12个小时执行一次
    
    if(!file_exists(dirname(__FILE__).'/cron-run')) {
      exit(); // 在目录下存放一个cron-run文件,如果这个文件不存在,说明已经在执行过程中了,该任务就不能再激活,执行第二次,否则这个文件被多次访问的话,服务器就要崩溃掉了
    }
    do {  
      if(!file_exists(dirname(__FILE__).'/cron-switch')) {
        break; // 如果不存在cron-switch这个文件,就停止执行,这是一个开关的作用  
      }
      $gmt_time = microtime(true); // 当前的运行时间,精确到0.0001秒  
      $loop = isset($loop) && $loop ? $loop : $run_time - $gmt_time; // 这里处理是为了确定还要等多久才开始第一次执行任务,$loop就是要等多久才执行的时间间隔  
      $loop = $loop > 0 ? $loop : 0;  
      if(!$loop) break; // 如果循环的间隔为零,则停止  
      sleep($loop);
      // ...
      // 执行某些代码
      // ...
      @unlink(dirname(__FILE__).'/cron-run'); // 这里就是通过删除cron-run来告诉程序,这个定时任务已经在执行过程中,不能再执行一个新的同样的任务  
      $loop = $interval;
    } 
    while(true);
    

    在需要执行计划任务的时候,写一个cron-run文件,需要终止的时候写一个cron-switch文件。

    需要注意的是,千万要写好脚本执行的程序,不然这个程序会一直运行下去

    相关文章

      网友评论

          本文标题:使用PHP代码实现计划任务

          本文链接:https://www.haomeiwen.com/subject/misbwftx.html