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

相关文章

使用Nginx配置文件服务器方式

《使用Nginx配置文件服务器方式》:本文主要介绍使用Nginx配置文件服务器方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 为什么选择 Nginx 作为文件服务器?2. 环境准备3. 配置 Nginx 文件服务器4. 将文件放入服务器目录5. 启动 N

SpringBoot中HTTP连接池的配置与优化

《SpringBoot中HTTP连接池的配置与优化》这篇文章主要为大家详细介绍了SpringBoot中HTTP连接池的配置与优化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、HTTP连接池的核心价值二、Spring Boot集成方案方案1:Apache HttpCl

Spring Boot Controller处理HTTP请求体的方法

《SpringBootController处理HTTP请求体的方法》SpringBoot提供了强大的机制来处理不同Content-Type​的HTTP请求体,这主要依赖于HttpMessageCo... 目录一、核心机制:HttpMessageConverter​二、按Content-Type​处理详解1.

Python 异步编程 asyncio简介及基本用法

《Python异步编程asyncio简介及基本用法》asyncio是Python的一个库,用于编写并发代码,使用协程、任务和Futures来处理I/O密集型和高延迟操作,本文给大家介绍Python... 目录1、asyncio是什么IO密集型任务特征2、怎么用1、基本用法2、关键字 async1、async

Django之定时任务django-crontab的实现

《Django之定时任务django-crontab的实现》Django可以使用第三方库如django-crontab来实现定时任务的调度,本文主要介绍了Django之定时任务django-cront... 目录crontab安装django-crontab注册应用定时时间格式定时时间示例设置定时任务@符号

嵌入式Linux驱动中的异步通知机制详解

《嵌入式Linux驱动中的异步通知机制详解》:本文主要介绍嵌入式Linux驱动中的异步通知机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、异步通知的核心概念1. 什么是异步通知2. 异步通知的关键组件二、异步通知的实现原理三、代码示例分析1. 设备结构

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结