swoole学习定时器和任务投递

0 篇文章 0 订阅
今天学习swoole的定时器。
安装swoole的环境不在本文讨论内容内,建议使用万能的docker。

需求是,用浏览器打开一个页面。

有文本框,如填写一个数字,服务器得到这个数字,加1返回给浏览器。如果是文字,就直接返回文字。

同时,服务器有自己的定时器。
这些代码只为学习,本身逻辑无意义。

任务的学习:每次,服务器接到浏览器的请求,会生成一个任务并自己执行:任务就是显示一个任务id,并没有什么。

服务端共有两个程序:http_server.php和 ws_server.php
其中http_server.php,只为了给浏览器一些js代码,而ws_server是完成上面的需求的。

代码如下:
http_server.php

<?php
$http = new swoole_http_server("0.0.0.0", 8000);

$html=<<<html
<script src='https://cdn.bootcss.com/jquery/3.2.1/jquery.slim.min.js'></script>
<script>
var wsServer = 'ws://192.168.99.100:9501';
var websocket = new WebSocket(wsServer);
websocket.onopen = function (evt) {
console.log("Connected to WebSocket server.");
};

websocket.onclose = function (evt) {
console.log("Disconnected");
};

websocket.onmessage = function (evt) {
console.log('Retrieved data from server: ' + evt.data);
};

websocket.onerror = function (evt, e) {
console.log('Error occured: ' + evt.data);
};

function aa(){
websocket.send($('#t1').val() );
}
</script>
<div>
<textarea id='t1'></textarea>
<button onclick="aa()" >button</button>
</div>
<div id='div1'></div>
html;

$http->on('request', function ($request, $response) use ($html) {
var_dump($request->get, $request->post);
$response->header("Content-Type", "text/html; charset=utf-8");
$response->end("<h1>Hello Swoole </h1>\n".$html);
});
$http->set(['daemonize'=>1]);
$http->start();




ws_server.php

<?php
// 创建websocket服务器对象,监听0.0.0.0:9502端口
$ws = new swoole_websocket_server ( "0.0.0.0", 9501 );
$ws->set ( array (
'task_worker_num' => 4
) );

// 监听WebSocket连接打开事件
$ws->on ( 'open', function ($ws, $request) {
echo "请求的fd:". $request->fd ."\n" ;
$ws->push ( $request->fd, "hello, welcome\n" );
} );

// 监听WebSocket消息事件
$ws->on ( 'message', function ($ws, $frame) {
echo "接收到Message: {$frame->data}\n";


if (is_numeric($frame->data )) {
$v = $frame->data + 1;
} else {
$v = $frame->data;
}

$ws->push ( $frame->fd, "server: {$v}" );

$task_id = $ws->task ( $v );
echo "Dispath AsyncTask: id=$task_id\n";
} );

// 监听WebSocket连接关闭事件
$ws->on ( 'close', function ($ws, $fd) {
echo "client-{$fd} is closed\n";
} );

// 处理异步任务
$ws->on ( 'task', function ($serv, $task_id, $from_id, $data) {
echo "New AsyncTask[id=$task_id]" . PHP_EOL;
// 返回任务执行的结果
$serv->finish ( "$data -> OK" );
} );

// 处理异步任务的结果
$ws->on ( 'finish', function ($serv, $task_id, $data) {
echo "AsyncTask[$task_id] Finish: $data" . PHP_EOL;
} );

// 这是服务器自己的定时器。
$process = new swoole_process ( function () {
swoole_timer_tick ( 5000, function () {
echo date ( "H:i:s" ) . "swoole_timer_tick. \n";
} );
} );
$ws->addProcess ( $process );

$ws->start ();


在服务器shell下。执行
php http_server.php
php ws_server.php

然后,浏览器打开
http://192.168.99.100:8000/

效果:
服务端效果如下:
[img]http://dl2.iteye.com/upload/attachment/0130/6785/8b219ef9-8615-3399-99f0-51bdf4289a58.png[/img]


浏览器效果如下:注意是显示在控制台。
[img]http://dl2.iteye.com/upload/attachment/0130/6791/581898dc-59e6-32d0-8a00-6ecbe3fc6062.png[/img]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TP6(ThinkPHP 6)是一个基于PHP的高性能、简洁的开发框架,而Swoole是一个PHP的异步、并发的网络通信框架。TP6结合Swoole可以实现秒级的定时任务。 要实现TP6Swoole定时器,可以按照以下步骤进行操作: 1. 首先,在TP6项目安装Swoole扩展包,可以使用composer命令进行安装。引用 2. 然后,创建一个定时任务的类,可以在该类定义需要执行的定时任务的逻辑。该类需要继承`\think\swoole\coroutine\Task`类,并实现`handle`方法。在`handle`方法编写具体的定时任务逻辑。 3. 在TP6的配置文件配置Swoole定时器,可以在`config/swoole.php`文件进行配置。在`timer`选项,可以定义定时任务的执行时间间隔和需要执行的任务类。可以配置多个定时任务。 4. 启动Swoole服务器,在启动命令加上`--with-timer`选项,这样Swoole服务器就会自动启动定时器,并按照配置的时间间隔执行定时任务。 通过以上步骤,就可以在TP6使用Swoole定时器实现秒级的定时任务了。请根据实际需求和具体情况进行配置和编码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [使用swoole 定时器变更超时未支付订单状态的解决方案](https://download.csdn.net/download/weixin_38667849/12938839)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [thinkphp6+swoole实现crontab项目定时任务](https://blog.csdn.net/u010192444/article/details/126757577)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值