workerman定时器使用(附示例代码)

Freigeben: 2019-11-26 14:29:59
nach vorne
3722 Leute haben es durchsucht

下面由workerman php教程栏目给大家介绍workerman定时器使用方法,希望对需要的朋友有所帮助!

workerman定时器使用(附示例代码)

Workerman是一个高性能的socket服务器通讯框架,用于快速开发各种网络应用,包括tcp的、udp的、长连接、短连接应用。下面我们来介绍一下workerman定时器使用。

add

int \Workerman\Lib\Timer::add(float $time_interval, callable $callback [,$args = array(), bool $persistent = true])
Nach dem Login kopieren

定时执行某个函数或者类方法

参数

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();
Nach dem Login kopieren

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();
Nach dem Login kopieren

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();
Nach dem Login kopieren

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();
Nach dem Login kopieren

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();
Nach dem Login kopieren

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();
Nach dem Login kopieren

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();
Nach dem Login kopieren

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();
Nach dem Login kopieren

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();
Nach dem Login kopieren

更多workerman知识请关注workerman教程栏目。

Das obige ist der detaillierte Inhalt vonworkerman定时器使用(附示例代码). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:cnblogs.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!