swoole中的swoole_http_server是一种什么状态,可以直接使用它作为应用服务器吗?

论坛 期权论坛 期权     
匿名用户1024   2021-5-30 23:02   8328   3
分享到 :
0 人收藏

3 个回复

倒序浏览
2#
有关回应  16级独孤 | 2021-5-30 23:02:11
做过java或者接触过servlet的可能会更加理解一点swoole_http_server,这是一种基于内存级别多进程模式的服务器,原理同nginx类似,不过作为web服务器没有nginx完善,可以用nginx做反向代理,做应用服务器绝对没问题,不过有些坑,初级程序员用传统的lnmp架构就行了,swoole服务器启动之后会在每个worker进程里边分别存储一份对象。对对象的值把控要有很好的理解能力,。
3#
有关回应  16级独孤 | 2021-5-30 23:02:12
Swoole除了能异步处理PHP请求,还能处理静态文件(资源存在,直接返回,无需编程).
所以当然可以把 Swoole 作为一个应用服务器.
比如你起一个 swoole_websocket_server 服务,那么:
监听 request 事件就能处理HTTP请求.
监听 open 和 message 事件就能处理WebSocket请求.
监听 connect 和 receive 事件就能处理TCP(MQTT)请求.
HTTP/WebSocket/TCP在连接关闭时,都会触发 close 事件.
业务逻辑就写在这些事件的回调函数中.
这些事件回调函数的逻辑都由worker进程执行.
在worker进程中,可以使用Swoole提供的各种异步特性,比如:
定时器,异步DNS/TCP/UDP/HTTP/WebSocket/Redis/MySQL客户端,异步文件读写等等.
但要注意,worker进程之间是内存隔离的,每个worker进程里的PHP的全局变量是互不相关的,所以如果你的程序要在不同worker进程间共享数据,可以用Swoole内置的table或者外部的Redis.
Swoole还提供有一种task进程,worker进程中的PHP逻辑可以使用$task_id = $serv->task($json)投递任务到task进程,这个投递任务的操作是异步非阻塞的.worker进程在监听的finish事件(可选)的回调函数中可以拿到任务完成后返回的结果.应用场景如数据库连接池,如向所有在线用户推送消息(系统消息),避免阻塞到worker进程等等.
另外,对一些连接资源(MySQL连接,Redis连接)也需要注意:
PHP-FPM下,每个请求,函数都会被重新定义一次,函数里的static变量跟上一次请求的状态无关.所以,即使PHP-FPM维持的长连接丢失,依然可以通过新请求执行pconnect重新建立连接.Swoole下,函数只会定义一次,并常驻内存,函数里的static变量在不同请求里都起作用(静态变量跨请求).所以Swoole处理新请求时,不会执行pconnect操作,所以连接丢失时,Swoole不能在新请求中重新建立连接.
[code]
4#
有关回应  16级独孤 | 2021-5-30 23:02:13
swoole_http_server是可以当作应用服务器的,接收来自nginx(或者其他web服务器)的转发请求。http_server启动时会初始化一次php环境,之后的请求不会重新初始化php,这样可以提高动态请求的响应速度,而且swoole和nodejs一样是基于异步请求开发的,基于上述原因,使用swoole_http_server能得到较高的压测数据和实际并发请求数。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:136515
帖子:27303
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP