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] |