• 售前

  • 售后

热门帖子
入门百科

php workerman定时使命的实当代码

[复制链接]
龙的传人739 显示全部楼层 发表于 2021-10-26 13:44:05 |阅读模式 打印 上一主题 下一主题
一、下载workerman

https://www.workerman.net/download
二、下载workerman/mysql

http://doc3.workerman.net/640201
1、定时函数为匿名函数(闭包)
  1. use \Workerman\Worker;
  2. use \Workerman\Lib\Timer;
  3. require_once './Workerman/Autoloader.php';
  4. $task = new Worker();
  5. // 开启多少个进程运行定时任务,注意多进程并发问题
  6. $task->count = 1;
  7. $task->onWorkerStart = function($task)
  8. {
  9.   // 每2.5秒执行一次
  10.   $time_interval = 2.5;
  11.   Timer::add($time_interval, function()
  12.   {
  13.     echo "task run\n";
  14.   });
  15. };
  16. // 运行worker
  17. Worker::runAll();
复制代码
2、定时函数为普通函数
  1. require_once './Workerman/Autoloader.php';
  2. use \Workerman\Worker;
  3. use \Workerman\Lib\Timer;
  4. // 普通的函数
  5. function send_mail($to, $content)
  6. {
  7.   echo "send mail ...\n";
  8. }
  9. $task = new Worker();
  10. $task->onWorkerStart = function($task)
  11. {
  12.   $to = 'workerman@workerman.net';
  13.   $content = 'hello workerman';
  14.   // 10秒后执行发送邮件任务,最后一个参数传递false,表示只运行一次
  15.   Timer::add(10, 'send_mail', array($to, $content), false);
  16. };
  17. // 运行worker
  18. Worker::runAll();
复制代码
3、定时函数为类的方法
  1. require_once './Workerman/Autoloader.php';
  2. use \Workerman\Worker;
  3. use \Workerman\Lib\Timer;
  4. class Mail
  5. {
  6.   // 注意,回调函数属性必须是public
  7.   public function send($to, $content)
  8.   {
  9.     echo "send mail ...\n";
  10.   }
  11. }
  12. $task = new Worker();
  13. $task->onWorkerStart = function($task)
  14. {
  15.   // 10秒后发送一次邮件
  16.   $mail = new Mail();
  17.   $to = 'workerman@workerman.net';
  18.   $content = 'hello workerman';
  19.   Timer::add(10, array($mail, 'send'), array($to, $content), false);
  20. };
  21. // 运行worker
  22. Worker::runAll();
复制代码
4、定时函数为类方法(类内部使用定时器)
  1. require_once './Workerman/Autoloader.php';
  2. use \Workerman\Worker;
  3. use \Workerman\Lib\Timer;
  4. class Mail
  5. {
  6.   // 注意,回调函数属性必须是public
  7.   public function send($to, $content)
  8.   {
  9.     echo "send mail ...\n";
  10.   }
  11.   public function sendLater($to, $content)
  12.   {
  13.     // 回调的方法属于当前的类,则回调数组第一个元素为$this
  14.     Timer::add(10, array($this, 'send'), array($to, $content), false);
  15.   }
  16. }
  17. $task = new Worker();
  18. $task->onWorkerStart = function($task)
  19. {
  20.   // 10秒后发送一次邮件
  21.   $mail = new Mail();
  22.   $to = 'workerman@workerman.net';
  23.   $content = 'hello workerman';
  24.   $mail->sendLater($to, $content);
  25. };
  26. // 运行worker
  27. Worker::runAll();
复制代码
5、定时函数为类的静态方法
  1. require_once './Workerman/Autoloader.php';
  2. use \Workerman\Worker;
  3. use \Workerman\Lib\Timer;
  4. class Mail
  5. {
  6.   // 注意这个是静态方法,回调函数属性也必须是public
  7.   public static function send($to, $content)
  8.   {
  9.     echo "send mail ...\n";
  10.   }
  11. }
  12. $task = new Worker();
  13. $task->onWorkerStart = function($task)
  14. {
  15.   // 10秒后发送一次邮件
  16.   $to = 'workerman@workerman.net';
  17.   $content = 'hello workerman';
  18.   // 定时调用类的静态方法
  19.   Timer::add(10, array('Mail', 'send'), array($to, $content), false);
  20. };
  21. // 运行worker
  22. Worker::runAll();
复制代码
6、定时函数为类的静态方法(带定名空间)
  1. namespace Task;
  2. require_once './Workerman/Autoloader.php';
  3. use \Workerman\Worker;
  4. use \Workerman\Lib\Timer;
  5. class Mail
  6. {
  7.   // 注意这个是静态方法,回调函数属性也必须是public
  8.   public static function send($to, $content)
  9.   {
  10.     echo "send mail ...\n";
  11.   }
  12. }
  13. $task = new Worker();
  14. $task->onWorkerStart = function($task)
  15. {
  16.   // 10秒后发送一次邮件
  17.   $to = 'workerman@workerman.net';
  18.   $content = 'hello workerman';
  19.   // 定时调用带命名空间的类的静态方法
  20.   Timer::add(10, array('\Task\Mail', 'send'), array($to, $content), false);
  21. };
  22. // 运行worker
  23. Worker::runAll();
复制代码
7、定时器中烧毁当前定时器(use闭包方式转达$timer_id)
  1. use \Workerman\Worker;
  2. use \Workerman\Lib\Timer;
  3. require_once './Workerman/Autoloader.php';
  4. $task = new Worker();
  5. $task->onWorkerStart = function($task)
  6. {
  7.   // 计数
  8.   $count = 1;
  9.   // 要想$timer_id能正确传递到回调函数内部,$timer_id前面必须加地址符 &
  10.   $timer_id = Timer::add(1, function()use(&$timer_id, &$count)
  11.   {
  12.     echo "Timer run $count\n";
  13.     // 运行10次后销毁当前定时器
  14.     if($count++ >= 10)
  15.     {
  16.       echo "Timer::del($timer_id)\n";
  17.       Timer::del($timer_id);
  18.     }
  19.   });
  20. };
  21. // 运行worker
  22. Worker::runAll();
复制代码
8、定时器中烧毁当前定时器(参数方式转达$timer_id)
  1. require_once './Workerman/Autoloader.php';
  2. use \Workerman\Worker;
  3. use \Workerman\Lib\Timer;
  4. class Mail
  5. {
  6.   public function send($to, $content, $timer_id)
  7.   {
  8.     // 临时给当前对象添加一个count属性,记录定时器运行次数
  9.     $this->count = empty($this->count) ? 1 : $this->count;
  10.     // 运行10次后销毁当前定时器
  11.     echo "send mail {$this->count}...\n";
  12.     if($this->count++ >= 10)
  13.     {
  14.       echo "Timer::del($timer_id)\n";
  15.       Timer::del($timer_id);
  16.     }
  17.   }
  18. }
  19. $task = new Worker();
  20. $task->onWorkerStart = function($task)
  21. {
  22.   $mail = new Mail();
  23.   // 要想$timer_id能正确传递到回调函数内部,$timer_id前面必须加地址符 &
  24.   $timer_id = Timer::add(1, array($mail, 'send'), array('to', 'content', &$timer_id));
  25. };
  26. // 运行worker
  27. Worker::runAll();
复制代码
9、只在指定进程中设置定时器
一个worker实例有4个进程,只在id编号为0的进程上设置定时器。
  1. use Workerman\Worker;
  2. use Workerman\Lib\Timer;
  3. require_once './Workerman/Autoloader.php';
  4. $worker = new Worker();
  5. $worker->count = 4;
  6. $worker->onWorkerStart = function($worker)
  7. {
  8.   // 只在id编号为0的进程上设置定时器,其它1、2、3号进程不设置定时器
  9.   if($worker->id === 0)
  10.   {
  11.     Timer::add(1, function(){
  12.       echo "4个worker进程,只在0号进程设置定时器\n";
  13.     });
  14.   }
  15. };
  16. // 运行worker
  17. Worker::runAll();
复制代码
示例
shipments.php用来写定时任务
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Administrator
  5. * Date: 2018/11/29
  6. * Time: 16:59
  7. */
  8. use Workerman\Worker;
  9. use \Workerman\Lib\Timer;
  10. require_once "Workerman/Autoloader.php";
  11. require_once "Connection.php";
  12. $task = new Worker();
  13. $task->onWorkerStart = function ($task) {
  14.   global $db, $redis;
  15.   $db  = new \Workerman\MySQL\Connection('127.0.0.1', '3306', 'root', 'root', 'test');
  16.   $redis = new Redis();
  17.   $redis->connect('127.0.0.1', 6379);
  18.   $redis->auth("qqq123123.");
  19.   $time_interval = 0.1;
  20.   Timer::add($time_interval, function () {
  21.     global $db, $redis;
  22.    
  23.     $insert['name'] = 123;
  24.    
  25.     $db->insert('shipments')->cols($insert)->query();
  26. //    sleep(100);
  27.   });
  28. };
  29. function curlGet($url = '', $options = [])
  30. {
  31.   $ch = curl_init($url);
  32.   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  33.   curl_setopt($ch, CURLOPT_TIMEOUT, 30);
  34.   if (!empty($options)) {
  35.     curl_setopt_array($ch, $options);
  36.   }
  37.   //https请求 不验证证书和host
  38.   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  39.   curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  40.   $data = curl_exec($ch);
  41.   curl_close($ch);
  42.   return $data;
  43. }
  44. function newGetOrderInfo($taobao, $orderId)
  45. {
  46.   $taobao = urlencode($taobao);
  47.   $url  = "http://114.55.144.79/taobao/TradeFullinfoGetRequest.php?shop=$taobao&tid=$orderId";
  48.   $json  = curlGet($url);
  49.   return json_decode($json, true)['trade'];
  50. }
  51. Worker::runAll();
复制代码
以上就是本文的全部内容,盼望对各人的学习有所资助,也盼望各人多多支持脚本之家。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作