swoole http服务器task投递异步任务

2024-09-05 08:08

本文主要是介绍swoole http服务器task投递异步任务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

官网的task案例代码是在tcp服务器中写的,本人在想,http服务器也是server服务器中的一种,应该也可以投递task任务。

一个简单的http服务器代码:

  

$server = new Swoole\Http\Server('127.0.0.1',8888);$server->on('request',function($request, $response) use($server){if(strpos($request->server['request_uri'],'.ico') !== false){$response->end("");}else{$content = $request->server;$response->end("<h1>Hello Swoole. #".rand(1000, 9999).$content['server_port']."</h1>");}});echo "服务器启动!".PHP_EOL;
$server->start();

-------------------------------------------------------------------------------------------------------------------------

官网api中已经说明 :"使用Task功能,必须先设置 task_worker_num,并且必须设置ServeronTaskonFinish事件回调函数"

那么代码修改如下:

$server = new Swoole\Http\Server('127.0.0.1',8888);$server->set(['task_worker_num' =>4
]);$server->on('request',function($request, $response) use($server){if(strpos($request->server['request_uri'],'.ico') !== false){$response->end("");}else{$content = $request->server;$response->end("<h1>Hello Swoole. #".rand(1000, 9999).$content['server_port']."</h1>");}});$server->on("Task",function (Swoole\Server $serv, $task_id, $from_id, $data){echo "异步任务Data:".$data.PHP_EOL;$serv->finish($data);});$server->on("Finish",function (Swoole\Server $serv, $task_id, $data){echo "异步任务结束:".PHP_EOL;echo "异步任务结束,数据:".$data.PHP_EOL;});echo "服务器启动!".PHP_EOL;
$server->start();

上述代码怎么投递任务呢,既然http服务器,那就能使用server中的一些方法,尝试使用connect方法:

$server = new Swoole\Http\Server('127.0.0.1',8888);$server->set(['task_worker_num' =>4
]);$server->on("connect",function ($serv, $fd){echo "链接服务器:".$fd.PHP_EOL;$serv->task('task');
});$server->on('request',function($request, $response) use($server){if(strpos($request->server['request_uri'],'.ico') !== false){$response->end("");}else{$content = $request->server;$response->end("<h1>Hello Swoole. #".rand(1000, 9999).$content['server_port']."</h1>");}
});$server->on("Task",function (Swoole\Server $serv, $task_id, $from_id, $data){echo "异步任务Data:".$data.PHP_EOL;$serv->finish($data);
});$server->on("Finish",function (Swoole\Server $serv, $task_id, $data){echo "异步任务结束:".PHP_EOL;echo "异步任务结束,数据:".$data.PHP_EOL;
});echo "服务器启动!".PHP_EOL;
$server->start();

浏览器访问  http://127.0.0.1:8888/?id=1  的结果:

很明显  connect 方法回调了两次,官网也说明了http服务器在浏览器中方法会有两次请求。说明放在connect方法中投递任务虽然可以但是会有问题。看代码结构 只有在onrequest中回调方法中投递任务是最理想的,可以根据业务来判断是否投递任务,不知道回调方法能不能引用server 变量。代码如下:

$server = new Swoole\Http\Server('127.0.0.1',8888);$server->set(['task_worker_num' =>4
]);$server->on('request',function($request, $response) use($server){if(strpos($request->server['request_uri'],'.ico') !== false){$response->end("");}else{$content = $request->server;$server->task('data');$response->end("<h1>Hello Swoole. #".rand(1000, 9999).$content['server_port']."</h1>");}
});$server->on("Task",function (Swoole\Server $serv, $task_id, $from_id, $data){echo "异步任务Data:".$data.PHP_EOL;$serv->finish($data);
});$server->on("Finish",function (Swoole\Server $serv, $task_id, $data){echo "异步任务结束:".PHP_EOL;echo "异步任务结束,数据:".$data.PHP_EOL;
});echo "服务器启动!".PHP_EOL;
$server->start();

执行文件,浏览器访问结果:

程序没有报错,而且task任务只投递了一次。

这篇关于swoole http服务器task投递异步任务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1138402

相关文章

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

js异步提交form表单的解决方案

1.定义异步提交表单的方法 (通用方法) /*** 异步提交form表单* @param options {form:form表单元素,success:执行成功后处理函数}* <span style="color:#ff0000;"><strong>@注意 后台接收参数要解码否则中文会导致乱码 如:URLDecoder.decode(param,"UTF-8")</strong></span>

ActiveMQ—消息特性(延迟和定时消息投递)

ActiveMQ消息特性:延迟和定时消息投递(Delay and Schedule Message Delivery) 转自:http://blog.csdn.net/kimmking/article/details/8443872 有时候我们不希望消息马上被broker投递出去,而是想要消息60秒以后发给消费者,或者我们想让消息没隔一定时间投递一次,一共投递指定的次数。。。 类似

速盾:直播 cdn 服务器带宽?

在当今数字化时代,直播已经成为了一种非常流行的娱乐和商业活动形式。为了确保直播的流畅性和高质量,直播平台通常会使用 CDN(Content Delivery Network,内容分发网络)服务器来分发直播流。而 CDN 服务器的带宽则是影响直播质量的一个重要因素。下面我们就来探讨一下速盾视角下的直播 CDN 服务器带宽问题。 一、直播对带宽的需求 高清视频流 直播通常需要传输高清视频

Anaconda 中遇到CondaHTTPError: HTTP 404 NOT FOUND for url的问题及解决办法

最近在跑一个开源项目遇到了以下问题,查了很多资料都大(抄)同(来)小(抄)异(去)的,解决不了根本问题,费了很大的劲终于得以解决,记录如下: 1、问题及过程: (myenv) D:\Workspace\python\XXXXX>conda install python=3.6.13 Solving environment: done.....Proceed ([y]/n)? yDownloa

一种改进的red5集群方案的应用、基于Red5服务器集群负载均衡调度算法研究

转自: 一种改进的red5集群方案的应用: http://wenku.baidu.com/link?url=jYQ1wNwHVBqJ-5XCYq0PRligp6Y5q6BYXyISUsF56My8DP8dc9CZ4pZvpPz1abxJn8fojMrL0IyfmMHStpvkotqC1RWlRMGnzVL1X4IPOa_  基于Red5服务器集群负载均衡调度算法研究 http://ww