swoole学习定时器和任务投递
程序员文章站
2022-04-04 16:49:02
...
今天学习swoole的定时器。
安装swoole的环境不在本文讨论内容内,建议使用万能的docker。
需求是,用浏览器打开一个页面。
有文本框,如填写一个数字,服务器得到这个数字,加1返回给浏览器。如果是文字,就直接返回文字。
同时,服务器有自己的定时器。
这些代码只为学习,本身逻辑无意义。
任务的学习:每次,服务器接到浏览器的请求,会生成一个任务并自己执行:任务就是显示一个任务id,并没有什么。
服务端共有两个程序:http_server.php和 ws_server.php
其中http_server.php,只为了给浏览器一些js代码,而ws_server是完成上面的需求的。
代码如下:
http_server.php
ws_server.php
在服务器shell下。执行
php http_server.php
php ws_server.php
然后,浏览器打开
http://192.168.99.100:8000/
效果:
服务端效果如下:
浏览器效果如下:注意是显示在控制台。
安装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/
效果:
服务端效果如下:
浏览器效果如下:注意是显示在控制台。
上一篇: php如何设置超时时间
下一篇: php怎么判断字符串不为空