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

相关文章

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

Spring定时任务之fixedRateString的实现示例

《Spring定时任务之fixedRateString的实现示例》本文主要介绍了Spring定时任务之fixedRateString的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录从毫秒到 Duration:为何要改变?核心:Java.time.Duration.parse

Oracle Scheduler任务故障诊断方法实战指南

《OracleScheduler任务故障诊断方法实战指南》Oracle数据库作为企业级应用中最常用的关系型数据库管理系统之一,偶尔会遇到各种故障和问题,:本文主要介绍OracleSchedul... 目录前言一、故障场景:当定时任务突然“消失”二、基础环境诊断:搭建“全局视角”1. 数据库实例与PDB状态2

Nginx屏蔽服务器名称与版本信息方式(源码级修改)

《Nginx屏蔽服务器名称与版本信息方式(源码级修改)》本文详解如何通过源码修改Nginx1.25.4,移除Server响应头中的服务类型和版本信息,以增强安全性,需重新配置、编译、安装,升级时需重复... 目录一、背景与目的二、适用版本三、操作步骤修改源码文件四、后续操作提示五、注意事项六、总结一、背景与

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python