• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    php workerman定时任务的实现代码

    一、下载workerman

    https://www.workerman.net/download

    二、下载workerman/mysql

    http://doc3.workerman.net/640201

    1、定时函数为匿名函数(闭包)

    use \Workerman\Worker;
    use \Workerman\Lib\Timer;
    require_once './Workerman/Autoloader.php';
    
    $task = new Worker();
    // 开启多少个进程运行定时任务,注意多进程并发问题
    $task->count = 1;
    $task->onWorkerStart = function($task)
    {
      // 每2.5秒执行一次
      $time_interval = 2.5;
      Timer::add($time_interval, function()
      {
        echo "task run\n";
      });
    };
    
    // 运行worker
    Worker::runAll();
    
    

    2、定时函数为普通函数

    require_once './Workerman/Autoloader.php';
    use \Workerman\Worker;
    use \Workerman\Lib\Timer;
    
    // 普通的函数
    function send_mail($to, $content)
    {
      echo "send mail ...\n";
    }
    
    $task = new Worker();
    $task->onWorkerStart = function($task)
    {
      $to = 'workerman@workerman.net';
      $content = 'hello workerman';
      // 10秒后执行发送邮件任务,最后一个参数传递false,表示只运行一次
      Timer::add(10, 'send_mail', array($to, $content), false);
    };
    
    // 运行worker
    Worker::runAll();
    
    

    3、定时函数为类的方法

    require_once './Workerman/Autoloader.php';
    use \Workerman\Worker;
    use \Workerman\Lib\Timer;
    
    class Mail
    {
      // 注意,回调函数属性必须是public
      public function send($to, $content)
      {
        echo "send mail ...\n";
      }
    }
    
    $task = new Worker();
    $task->onWorkerStart = function($task)
    {
      // 10秒后发送一次邮件
      $mail = new Mail();
      $to = 'workerman@workerman.net';
      $content = 'hello workerman';
      Timer::add(10, array($mail, 'send'), array($to, $content), false);
    };
    
    // 运行worker
    Worker::runAll();
    
    

    4、定时函数为类方法(类内部使用定时器)

    require_once './Workerman/Autoloader.php';
    use \Workerman\Worker;
    use \Workerman\Lib\Timer;
    
    class Mail
    {
      // 注意,回调函数属性必须是public
      public function send($to, $content)
      {
        echo "send mail ...\n";
      }
    
      public function sendLater($to, $content)
      {
        // 回调的方法属于当前的类,则回调数组第一个元素为$this
        Timer::add(10, array($this, 'send'), array($to, $content), false);
      }
    }
    
    $task = new Worker();
    $task->onWorkerStart = function($task)
    {
      // 10秒后发送一次邮件
      $mail = new Mail();
      $to = 'workerman@workerman.net';
      $content = 'hello workerman';
      $mail->sendLater($to, $content);
    };
    
    // 运行worker
    Worker::runAll();
    
    

    5、定时函数为类的静态方法

    require_once './Workerman/Autoloader.php';
    use \Workerman\Worker;
    use \Workerman\Lib\Timer;
    
    class Mail
    {
      // 注意这个是静态方法,回调函数属性也必须是public
      public static function send($to, $content)
      {
        echo "send mail ...\n";
      }
    }
    
    $task = new Worker();
    $task->onWorkerStart = function($task)
    {
      // 10秒后发送一次邮件
      $to = 'workerman@workerman.net';
      $content = 'hello workerman';
      // 定时调用类的静态方法
      Timer::add(10, array('Mail', 'send'), array($to, $content), false);
    };
    
    // 运行worker
    Worker::runAll();
    

    6、定时函数为类的静态方法(带命名空间)

    namespace Task;
    require_once './Workerman/Autoloader.php';
    use \Workerman\Worker;
    use \Workerman\Lib\Timer;
    
    class Mail
    {
      // 注意这个是静态方法,回调函数属性也必须是public
      public static function send($to, $content)
      {
        echo "send mail ...\n";
      }
    }
    
    $task = new Worker();
    $task->onWorkerStart = function($task)
    {
      // 10秒后发送一次邮件
      $to = 'workerman@workerman.net';
      $content = 'hello workerman';
      // 定时调用带命名空间的类的静态方法
      Timer::add(10, array('\Task\Mail', 'send'), array($to, $content), false);
    };
    
    // 运行worker
    Worker::runAll();
    
    

    7、定时器中销毁当前定时器(use闭包方式传递$timer_id)

    use \Workerman\Worker;
    use \Workerman\Lib\Timer;
    require_once './Workerman/Autoloader.php';
    
    $task = new Worker();
    $task->onWorkerStart = function($task)
    {
      // 计数
      $count = 1;
      // 要想$timer_id能正确传递到回调函数内部,$timer_id前面必须加地址符 
      $timer_id = Timer::add(1, function()use($timer_id, $count)
      {
        echo "Timer run $count\n";
        // 运行10次后销毁当前定时器
        if($count++ >= 10)
        {
          echo "Timer::del($timer_id)\n";
          Timer::del($timer_id);
        }
      });
    };
    
    // 运行worker
    Worker::runAll();
    
    

    8、定时器中销毁当前定时器(参数方式传递$timer_id)

    require_once './Workerman/Autoloader.php';
    use \Workerman\Worker;
    use \Workerman\Lib\Timer;
    
    class Mail
    {
      public function send($to, $content, $timer_id)
      {
        // 临时给当前对象添加一个count属性,记录定时器运行次数
        $this->count = empty($this->count) ? 1 : $this->count;
        // 运行10次后销毁当前定时器
        echo "send mail {$this->count}...\n";
        if($this->count++ >= 10)
        {
          echo "Timer::del($timer_id)\n";
          Timer::del($timer_id);
        }
      }
    }
    
    $task = new Worker();
    $task->onWorkerStart = function($task)
    {
      $mail = new Mail();
      // 要想$timer_id能正确传递到回调函数内部,$timer_id前面必须加地址符 
      $timer_id = Timer::add(1, array($mail, 'send'), array('to', 'content', $timer_id));
    };
    
    // 运行worker
    Worker::runAll();

    9、只在指定进程中设置定时器

    一个worker实例有4个进程,只在id编号为0的进程上设置定时器。

    use Workerman\Worker;
    use Workerman\Lib\Timer;
    require_once './Workerman/Autoloader.php';
    
    $worker = new Worker();
    $worker->count = 4;
    $worker->onWorkerStart = function($worker)
    {
      // 只在id编号为0的进程上设置定时器,其它1、2、3号进程不设置定时器
      if($worker->id === 0)
      {
        Timer::add(1, function(){
          echo "4个worker进程,只在0号进程设置定时器\n";
        });
      }
    };
    // 运行worker
    Worker::runAll();
    
    

    示例

    shipments.php用来写定时任务

    ?php
    /**
     * Created by PhpStorm.
     * User: Administrator
     * Date: 2018/11/29
     * Time: 16:59
     */
    
    use Workerman\Worker;
    use \Workerman\Lib\Timer;
    
    require_once "Workerman/Autoloader.php";
    
    
    require_once "Connection.php";
    
    $task = new Worker();
    
    $task->onWorkerStart = function ($task) {
    
      global $db, $redis;
      $db  = new \Workerman\MySQL\Connection('127.0.0.1', '3306', 'root', 'root', 'test');
      $redis = new Redis();
      $redis->connect('127.0.0.1', 6379);
      $redis->auth("qqq123123.");
      $time_interval = 0.1;
      Timer::add($time_interval, function () {
        global $db, $redis;
        
        $insert['name'] = 123;
        
        $db->insert('shipments')->cols($insert)->query();
    
    //    sleep(100);
      });
    
    };
    
    
    function curlGet($url = '', $options = [])
    {
      $ch = curl_init($url);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($ch, CURLOPT_TIMEOUT, 30);
      if (!empty($options)) {
        curl_setopt_array($ch, $options);
      }
      //https请求 不验证证书和host
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
      $data = curl_exec($ch);
      curl_close($ch);
      return $data;
    }
    
    function newGetOrderInfo($taobao, $orderId)
    {
      $taobao = urlencode($taobao);
      $url  = "http://114.55.144.79/taobao/TradeFullinfoGetRequest.php?shop=$taobaotid=$orderId";
      $json  = curlGet($url);
      return json_decode($json, true)['trade'];
    }
    
    Worker::runAll();
    
    

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:
    • PHP定时执行任务的3种方法详解
    • PHP定时执行计划任务的多种方法小结
    • 如何使用纯PHP实现定时器任务(Timer)
    • php定时计划任务的实现方法详解
    • php中定时计划任务的实现原理
    • PHP中使用sleep函数实现定时任务实例分享
    • 详解PHP执行定时任务的实现思路
    • win7计划任务定时执行PHP脚本设置图解
    • PHP实现定时执行任务的方法
    • 详解PHP实现执行定时任务
    上一篇:PHP时间日期增减操作示例【date strtotime实现加一天、加一月等操作】
    下一篇:tp5(thinkPHP5)框架连接数据库的方法示例
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    php workerman定时任务的实现代码 php,workerman,定时,任务,的,