swoole之任务和定时器
一、代码
<?php use Swoole\Server; /**
* 面向对象的形式 + task + timer
*/
class WebSocket
{
public $server; public function __construct()
{
$this->server = new Swoole\WebSocket\Server("0.0.0.0", 9501);
$this->server->set([
'worker_num' => 2,
'task_worker_num' => 2
]);
// 注册事件回调
$this->server->on('open', [$this, 'onOpen']);
$this->server->on('message', [$this, 'onMessage']);
$this->server->on('task', [$this, 'onTask']);
$this->server->on('finish', [$this, 'onFinish']);
$this->server->on('close', [$this, 'onClose']);
} public function run()
{
$this->server->start();
} public function onOpen(Server $server, $request)
{
echo "server: handshake success with fd{$request->fd}" . PHP_EOL;
} /**
* 监听我是消息事件
* @param \Swoole\WebSocket\Server $server
* @param \Swoole\Websocket\Frame $frame 包含了客户端发来的数据帧信息
*/
public function onMessage(Swoole\WebSocket\Server $server, Swoole\Websocket\Frame $frame)
{
echo "receive from {$frame->fd}:{$frame->data}, opcode:{$frame->opcode}, fin:{$frame->finish}" . PHP_EOL; $data = [
'task' => 1,
'fd' => $frame->fd,
];
// 投放一个 异步 onTask任务
$server->task($data); if ($frame->fd == 1) {
$times = 3;
// 开始一个定时任务 每隔2s执行
swoole_timer_tick(2000, function ($timerId) use ($server, $frame, &$times) {
if ($times > 0) {
echo '1s: timerId:' . $timerId . PHP_EOL;
$times--;
} else {
swoole_timer_clear($timerId);
$server->push($frame->fd, 'timer tick over');
}
});
} // 指定的时间后执行 比下面的push后执行(异步)10s
swoole_timer_after(10000, function () use ($server, $frame) {
$server->push($frame->fd, "task finished " . date('Y-m-d H:i:s'));
}); // 不会堵塞 返回给客户端信息
$server->push($frame->fd, "服务器返回数据");
} /**
* 处理一些耗时的任务
* @param Server $serv
* @param int $taskId 任务ID
* @param int $srcWorkerId 来自于哪个worker进程
* @param mixed $data 异步投递的数据 任务的内容
* @return string
*/
public function onTask(Server $serv, $taskId, $srcWorkerId, $data)
{
// 处理一些耗时的任务
// print_r($data);
sleep(10);
if (isset($data['fd'])) {
$serv->push($data['fd'], 'task start:' . date("Y-m-d H:i:s"));
} // onFinsh 告诉worker进程
return "我是任务处理完后回调" . PHP_EOL;
} /**
* 任务处理完后执行
* @param Server $serv
* @param int $taskId
* @param string $data onTask返回的内容
*/
public function onFinish(Server $serv, $taskId, $data)
{
echo 'taskId:' . $taskId . ' && task finished && data is ' . $data;
} /**
* TCP客户端连接关闭
* @param Server $ser
* @param int $fd
* @param int $reactorId 来自那个reactor线程
*/
public function onClose(Server $ser, $fd, $reactorId)
{
echo "client {$fd} closed\n";
}
} $server = new WebSocket();
$server->run();
客户端用的还是原来的 ws_client.html

服务器输出:

文档: https://wiki.swoole.com/wiki/page/397.html
swoole之任务和定时器的更多相关文章
- RabbitMQ 入门教程(PHP版) 延迟队列,延迟任务
延迟任务应用场景 场景一:物联网系统经常会遇到向终端下发命令,如果命令一段时间没有应答,就需要设置成超时. 场景二:订单下单之后30分钟后,如果用户没有付钱,则系统自动取消订单. 场景三:过1分钟给新 ...
- 如何使用 Workman 做一个聊天室
一:首先,得简单说说 thinkphp+workerman 的安装. 安装 thinkphp5.1 composer create-project topthink/think=5.1.x-dev t ...
- PHP框架Swoole的一个定时器Timer特性
在各种业务型系统中,往往需要服务器在后台扫描相关数据,触发相应的统计.通知等操作. 比如对于一个项目管理系统,需要每天的特定时间内,统计每项任务的执行.到期情况.整个项目的进度等等,根据统计情况,做相 ...
- 【swoole】如果使用好定时器功能
swoole中提供了一个定期器的用法 $server->tick(1000, function() use ($server, $fd) { $server->send($fd, &quo ...
- 关于swoole 定时器有时候无法清除的解决方法
关于swoole 定时器有时候无法清除的解决方法 有时候start里面写个定时器 有时候你关闭进程的时候 发现定时器还是可以进行 目前只有重启服务器才可以 清除 还有就是ps -ef | grep p ...
- Swoole 中毫秒定时器(Timer)的使用
间隔定时器, tick 定时器会持续触发,直到调用 clear() 清除为止. $timer = Swoole\Timer::tick(3000, function (int $timer_id, $ ...
- Swoole学习(六)Swoole之定时器的创建与清除
环境:Centos6.4,PHP环境:PHP7,Swoole2.1(在指定的时间后执行函数,需要1.7.7或更高版本) <?php //----------------------------- ...
- swoole 清除定时器提示no timer
首页确定一个核心概念 clearTimer仅可清除当前进程的定时器 server代码如下: <?php class Server { private $serv; private $timer; ...
- swoole 定时器 swoole_time_tick 和 swoole_time_after
<?php class myticker{ public $server = null; CONST host = '127.0.0.1'; CONST port = 9502; public ...
随机推荐
- From scratch 资源
neural-network-from-scratch:https://github.com/pangolulu/neural-network-from-scratch rnn-from-scratc ...
- subprocess.run()用法python3.7
def run(*popenargs, input=None, capture_output=False, timeout=None, check=False, **kwargs): "&q ...
- mysql 表这段内容替换
update `cr_article` set `img`=replace(`img`,'http://192.168.2.10/upload','http://zouke1220.oss-cn-be ...
- golang数据库操作初体验
在golang中,提供了标准的数据库接口database/sql包,做过数据库开发的应该知道,不同的数据库有不同的数据库驱动.比如mysql等,我们可以去找 https://golang.org/s/ ...
- solve License Key is legacy format when use ACTIVATION_CODE activate jetbrains-product 2019.3.1
1.the java-agent and ACTIVATION_CODE can get from this site:https://zhile.io/2018/08/25/jetbrains-li ...
- springmvc_ajax异步上传文件(基于ajaxfileupload.js)
引入js <script th:src="@{/js/ajaxfileupload.js}"></script> html <tr> <t ...
- vb.net与vb的区别
本文链接:https://blog.csdn.net/dfshsdr/article/details/63255645最近接触了vb.net,它增加了vb的很多特性,而且演化成为完全面向对象的编程语言 ...
- JavaScript高级特征之面向对象笔记
Javascript面向对象 函数 * Arguments对象: * Arguments对象是数组对象 * Arguments对象的length属性可以获取参数的个数 * 利用Arguments对象模 ...
- EC20的指令
AT+QURCCFG="urcport","usbat" :当设置在主串口时且用主串口进行AT交互时开机会收到一串状态的信息,默认USBAT就不会 AT+IPR ...
- Day11 - L - 邂逅明下 HDU - 2897
当日遇到月,于是有了明.当我遇到了你,便成了侣.那天,日月相会,我见到了你.而且,大地失去了光辉,你我是否成侣?这注定是个凄美的故事.(以上是废话)小t和所有世俗的人们一样,期待那百年难遇的日食.驻足 ...