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 ...
随机推荐
- 中国社交电商最新展望,S-KOL-C正突围而出
编辑 | 韩星 出品 | 于见(mpyujian) 通信技术.移动互联网的快速发展正加速国内电商平台的深度变革. 在这场以"社交"和"下沉市场"为关键词的电商之 ...
- Fleck WebSocket使用
Fleck WebSocket使用 作为笔记存储. 最近公司有这方面的使用需求.在网上查了一些资料后.得到了想要的结果.以下记录摘抄至网上资料. 1.首先,服务端.项目NuGet直接引用Fleck类库 ...
- Django 学习之Rest Framework 视图相关
drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作.所以在django原有的django.views.View类基础上,drf封装了多个子类出来提供给我们使用. Django REST ...
- 工具,Linux - tree命令,显示程序树型结构
sudo apt-get install tree tree --help
- Jquery+ajax模板
$.ajax({ url:'', type:'POST', //GET async:true, //或false,是否异步 data:{ name ...
- 从零构建以太坊(Ethereum)智能合约到项目实战——第23章 从零构建和部署去中心化投票App,decentralization Voting Dapp
P90 .1-从零构建和部署去中心化投票App-01 P91 .2-从零构建和部署去中心化投票App-02 P92 .3-从零构建和部署去中心化投票App-03 参考博文:http://liyuech ...
- jQuery常用操作(待续)
1. input清空内容 <1> $("#选择器id").val(""); <2> $("input[name='input框 ...
- Python函数-2 匿名函数
匿名函数 当我们在创建函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便.这省去了我们挖空心思为函数命名的麻烦,也能少写不少代码,很多编程语言都提供这一特性. Python语言使用lamb ...
- Mysql ,用户管理命令
添加用户.删除用户与授权以下对数据库的操作完全可以利用管理软件完成,比如在Navicat上进行操作,对数据库进行用户和权限管理. 1.创建用户:以root用户登录到数据库进行用户创建 命令: CREA ...
- Linux/CentOS环境下如何安装和配置PhantomJS工作环境
PhantomJS 是一个基于WebKit的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, C ...