php workerman定时任务的实现代码


Posted in PHP onDecember 23, 2018

一、下载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=$taobao&tid=$orderId";
  $json  = curlGet($url);
  return json_decode($json, true)['trade'];
}

Worker::runAll();

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

PHP 相关文章推荐
解析PayPal支付接口的PHP开发方式
Nov 28 PHP
PHP冒泡排序算法代码详细解读
Jul 17 PHP
php将gd生成的图片缓存到memcache的小例子
Jun 05 PHP
微信扫描二维码登录网站代码示例
Dec 30 PHP
PHP实现货币换算的方法
Nov 29 PHP
php实现paypal 授权登录
May 28 PHP
PHP实现163邮箱自动发送邮件
Mar 29 PHP
PHP获取网页所有连接的方法(附demo源码下载)
Mar 30 PHP
php关闭warning问题的解决方法
May 17 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
Mar 28 PHP
PHP通过文件路径获取文件名的实例代码
Oct 14 PHP
PHP实现简易图形计算器
Aug 28 PHP
PHP时间日期增减操作示例【date strtotime实现加一天、加一月等操作】
Dec 21 #PHP
PHP面向对象程序设计(OOP)之方法重写(override)操作示例
Dec 21 #PHP
PHP支付宝当面付2.0代码
Dec 21 #PHP
php json转换相关知识(小结)
Dec 21 #PHP
PHP后期静态绑定实例浅析
Dec 21 #PHP
PHP后期静态绑定之self::限制实例分析
Dec 21 #PHP
PHP类与对象后期静态绑定操作实例详解
Dec 20 #PHP
You might like
基于php实现的php代码加密解密类完整实例
2016/10/12 PHP
php 猴子摘桃的算法
2017/06/20 PHP
laravel自定义分页效果
2017/07/23 PHP
createElement与createDocumentFragment的点点区别小结
2011/12/19 Javascript
JS+CSS实现感应鼠标渐变显示DIV层的方法
2015/02/20 Javascript
jQuery实现复选框批量选择与反选的方法
2015/06/17 Javascript
jquery动态导航插件dynamicNav用法实例分析
2015/09/06 Javascript
JS获取input file绝对路径的方法(推荐)
2016/08/02 Javascript
jQuery fadeOut 异步实例代码详解
2016/08/18 Javascript
jQuery实现移动端Tab选项卡效果
2017/03/15 Javascript
基于Bootstrap分页的实例讲解(必看篇)
2017/07/04 Javascript
js注册时输入合法性验证方法
2017/10/21 Javascript
JS二级菜单不同实现方法分析【4种方法】
2018/12/21 Javascript
详解Vue后台管理系统开发日常总结(组件PageHeader)
2019/11/01 Javascript
jQuery实时统计输入框字数及限制
2020/06/24 jQuery
JavaScript语句错误throw、try及catch实例解析
2020/08/18 Javascript
使用TS来编写express服务器的方法步骤
2020/10/29 Javascript
浅析Python的Django框架中的Memcached
2015/07/23 Python
python如何压缩新文件到已有ZIP文件
2018/03/14 Python
python 协程中的迭代器,生成器原理及应用实例详解
2019/10/28 Python
python的slice notation的特殊用法详解
2019/12/27 Python
python 图像插值 最近邻、双线性、双三次实例
2020/07/05 Python
celery在python爬虫中定时操作实例讲解
2020/11/27 Python
css3 flex实现div内容水平垂直居中的几种方法
2020/03/27 HTML / CSS
Canvas获取视频第一帧缩略图的实现
2020/11/11 HTML / CSS
英国最大的网上药品商店:Chemist Direct
2017/12/16 全球购物
我能否用void** 指针作为参数, 使函数按引用接受一般指针
2013/02/16 面试题
如何做好总经理助理
2013/11/12 职场文书
教师实习自我鉴定
2013/12/13 职场文书
回门宴父母答谢词
2014/01/26 职场文书
2014道德模范事迹材料
2014/02/16 职场文书
2014年医学生毕业自我鉴定
2014/03/26 职场文书
爬山的活动方案
2014/08/16 职场文书
使用react+redux实现计数器功能及遇到问题
2021/06/02 Javascript
Python道路车道线检测的实现
2021/06/27 Python
面试中canvas绘制图片模糊图片问题处理
2022/03/13 Javascript