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,即精确到毫秒级别。
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 = '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();
workerman定时器使用的更多相关文章
- workerman定时器使用 php定时任务
add int \Workerman\Lib\Timer::add(float $time_interval, callable $callback [,$args = array(), bool $ ...
- thinkphp5使用workerman定时器定时爬取某站点新闻资讯等内容
1.首先通过 composer 安装workerman,在thinkphp5完全开发手册的扩展->coposer包->workerman有详细说明: #在项目根目录执行以下指令compos ...
- thinkphp5使用workerman的定时器定时任务在某一个时间执行
1.首先通过 composer 安装workerman,在thinkphp5完全开发手册的扩展->coposer包->workerman有详细说明: #在项目根目录执行以下指令compos ...
- workerman 的属性
<?php /** * Created by PhpStorm. * User: zeopean * Date: 2016-08-26 * Time: 16:35 */ use Workerma ...
- workerman是一个高性能的PHP socket服务器框架
workerman-chatorkerman是一款纯PHP开发的开源高性能的PHP socket服务器框架.被广泛的用于手机app.手游服务端.网络游戏服务器.聊天室服务器.硬件通讯服务器.智能家居. ...
- laravel整合workerman做聊天室
测试工具 http://www.blue-zero.com/WebSocket/ 2018年8月6日17:28:24 <?php namespace App\Console\Commands; ...
- laravel整合workerman做消息推送系统
官方建议分离 workerman和mvc框架的结合,我去,这不是有点脑缺氧吗? 大量的业务逻辑,去独立增加方法和类库在写一次,实际业务中是不现实和不实际的 gateway增加一些这方面的工作,但是我看 ...
- Workerman创建聊天室实例
// 标记是全局启动 define('GLOBAL_START', 1); require_once __DIR__ . '/Workerman/Connection.php'; require_on ...
- WorkerMan 入门学习之(三)基础教程-Timer类的使用
1.ServerTimer.php 代码: <?php /** * 定时器学习 */ require_once __DIR__ . '/Workerman/Autoloader.php'; us ...
随机推荐
- Mac下终端(terminal)的一些快捷键
Mac下终端(terminal)的一些快捷键 行首ctrl + a 行尾ctrl + e 两个终端窗口切换alt + 方向键 命令中,上一个单词esc + b (iterm2) 下一个单词esc + ...
- FFmpeg filter简介
[时间:2016-08] [状态:Open] [关键词:FFmpeg, filter, filter graph,命令行] 1. 引言及示例 FFmpeg中的libavfilter提供了一整套的基于f ...
- Python实例获取mp3文件的tag信息
下面利用一个python的实例程序,来学习python.这个程序的目的就是分析出所有MP3文件的Tag信息并输出. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- 遍历目录下的所有文件-os.walk
#coding:utf-8 import os for root,dirs,files in os.walk("D:"): for fileItem in files: print ...
- 前端常用功能记录(三)—datatables表格初始化(转)
数据源 我经常使用的有两种,一种是JavaScript 中的数组,通过在初始化对象中传递一个名为 aaData 的数组,同样可以提供表格数据,前缀 aa 说明这是一个数组的数组,外层的数组表示表格的行 ...
- 【Unity笔记】寻路导航Navigation中的区域Areas与消耗Cost
Navigation寻路导航界面下,Areas分页下是在给导航区域分类(相当于分层),以及为每个分类设置不同的消费Cost,意义在于,导航算法中会计算出的是累加起来消耗最低的路径(不一定是视觉上最短可 ...
- JMeter (3) —— JMeter录制脚本并压力测试用户登陆场景以CAS SSO为例(101 Tutorial)
JMeter (3) -- JMeter录制脚本并压力测试用户登陆场景以CAS SSO为例(101 Tutorial) 主要内容 JMeter录制脚本并进行压力测试用户登陆场景,并以CAS SSO单点 ...
- 【转】一篇文章读懂人力资源三支柱体系(COE・BP・SSC)
通过人力资源转型,提升效率和效能 作者:Sharon Li,翰威特大中华区咨询总监. 杰克韦尔奇曾说过“人力资源负责人在任何企业中都应该是第二号人物”,但在中国,99%的企业都做不到.原因很简单, ...
- 微软开放了.NET 4.5.1的源代码
您目前处于: InfoQ首页 新闻 微软开放了.NET 4.5.1的源代码 微软开放了.NET 4.5.1的源代码 作者 姚琪琳 发布于 二月 26, 2014 | 1 讨论 新浪微博腾讯微博豆瓣 ...
- redis详细配置文件
redis 单机版自己指定配置 #修改为守护模式 daemonize yes #设置进程锁文件 pidfile /usr/local/redis/redis.pid #端口 port 6379 #客户 ...