workerman定时器使用 php定时任务

add
int \Workerman\Lib\Timer::add(float $time_interval, callable $callback [,$args = array(), bool $persistent = true])
定时执行某个函数或者类方法

参数
time_interval

多长时间执行一次,单位秒,支持小数,可以精确到0.001,即精确到毫秒级别。

callback

回调函数注意:如果回调函数是类的方法,则方法必须是public属性

args

回调函数的参数,必须为数组,数组元素为参数值

persistent

是否是持久的,如果只想定时执行一次,则传递false(只执行一次的任务在执行完毕后会自动销毁,不必调用Timer::del())。默认是true,即一直定时执行。

返回值
返回一个整数,代表计时器的timerid,可以通过调用Timer::del($timerid)销毁这个计时器。

示例
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 = ‘[email protected]‘;
    $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 = ‘[email protected]‘;
    $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 = ‘[email protected]‘;
    $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 = ‘[email protected]‘;
    $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 = ‘[email protected]‘;
    $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();

  

原文地址:https://www.cnblogs.com/beyang/p/9970977.html

时间: 2024-10-27 03:05:40

workerman定时器使用 php定时任务的相关文章

workerman定时器使用

From: http://doc3.workerman.net/worker-development/add.html add int \Workerman\Lib\Timer::add(float $time_interval, callable $callback [,$args = array(), bool $persistent = true]) 定时执行某个函数或者类方法 参数 time_interval 多长时间执行一次,单位秒,支持小数,可以精确到0.001,即精确到毫秒级别.

Quartz cron 表达式(linux 定时器,java 定时任务,spring task定时任务)

Quartz cron 表达式的格式十分类似于 UNIX cron 格式,但还是有少许明显的区别.区别之一就是 Quartz 的格式向下支持到秒级别的计划,而 UNIX cron 计划仅支持至分钟级.许多我们的触发计划要基于秒级递增的(例如,每45秒),因此这是一个非常好的差异. 在 UNIX cron 里,要执行的作业(或者说命令)是存放在 cron 表达式中的,在第六个域位置上.Quartz 用 cron 表达式存放执行计划.引用了 cron 表达式的 CronTrigger 在计划的时间里

[spring-framework]Spring定时器的配置和使用

开发中我们常常会做一些定时任务,这些任务有开始时间,并会按一定的周期或规则执行.如此我们在Java程序开发中使用定时器来处理定时任务. <!-- MessageRequestTask类中包含了msgRequest方法,用于执行定时任务 --> <bean id="msg_request" class="com.santorini.task.timer.MessageRequestTask"></bean> <!-- 定时器配

Spring定时器的配置和使用

开发中我们常常会做一些定时任务,这些任务有开始时间,并会按一定的周期或规则执行.如此我们在Java程序开发中使用定时器来处理定时任务. <!-- MessageRequestTask类中包含了msgRequest方法,用于执行定时任务 --> <bean id="msg_request" class="com.santorini.task.timer.MessageRequestTask"></bean> <!-- 定时器配

Spring Task定时任务

Spring Task定时任务 1.基于Spring Task的任务调度方法: Spring框架自带的异步执行(TaskExecutor)和任务调度(TaskScheduler)接口. Spring Task官方地址: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html 以下是task任务调度配置:spring-tasks.xml <?xml version="1

【原】定时器与系统时间(续)

额外问题处理: -------------------------------------------------------------------------------- 13) 定时器之外的一些处理     a) window环境下,定时器通知执行定时任务的时间点可能误差1毫秒:Linux环境也有类似情况,但是误差频率低很多(只是在指定时间点前后1毫秒误差,心跳步长不差)         可能的影响:             以每秒任务为例, 10:00:00.000 TaskA ->

storm定时器timer源码分析-timer.clj

storm定时器与java.util.Timer定时器比较相似.java.util.Timer定时器实际上是个线程,定时调度所拥有的TimerTasks:storm定时器也有一个线程负责调度所拥有的"定时任务".storm定时器的"定时任务"是一个vector类型的数据[time, callback, uuid],内有会有三个值,分别是时间.函数.和uuid,很好理解,时间表示该定时任务什么时候执行,函数表示要执行的函数,uuid用于标识该"定时任务&qu

java定时器2-spring实现

spring定时器(基于xml) spring定时器(基于注解) quartz定时器 1.使用基于xml配置的spring定时器 首先编写定时任务类Mytask public class Mytask { public void execute(){ System.out.println("基于xml配置的spring定时任务!"); } } 接着在spring配置文件中加入xmlns:task="http://www.springframework.org/schema/t

netty实现动态定时器

最近开发一个后台游戏服务器,需要定时给 客户端推送 作物状态: 1.需要开启一个线程,执行定时任务 2.需要动态添加定时任务 3.需要动态修改定时任务时间. 网上找到两种方式:quartz服务 和HashedWheelTimer 这两种方式 ,项目中用的是HashedWheelTimer ,相关API可以自行百度或者看源码. 创建HashedWheelTimer  对象 通过 map<String,TimerOut> 来存储 定时器 通过设置定时任务返回timeOut  对象,存放在map中,