若转载教程,请注明出自SW-X框架官方文档
swoole_server中对象的4层生命周期
以下内容摘自swoole文档
开发swoole程序与普通LAMP下编程有本质区别。在传统的Web编程中,PHP程序员只需要关注request到达,request结束即可。而在swoole程序中程序员可以操控更大范围,变量/对象可以有四种生存周期。
变量、对象、资源、require/include的文件等下面统称为对象
程序全局期
在swoole_server->start
之前就创建好的对象,我们称之为程序全局生命周期。这些变量在程序启动后就会一直存在,直到整个程序结束运行才会销毁。
有一些服务器程序可能会连续运行数月甚至数年才会关闭/重启,那么程序全局期的对象在这段时间持续驻留在内存中的。程序全局对象所占用的内存是Worker
进程间共享的,不会额外占用内存。
这部分内存会在写时分离(COW
),在Worker
进程内对这些对象进行写操作时,会自动从共享内存中分离,变为进程全局对象。
程序全局期
include
/require
的代码,必须在整个程序shutdown
时才会释放,reload
无效
进程全局期
swoole拥有进程生命周期控制的机制,一个Worker
子进程处理的请求数超过max_request配置后,就会自动销毁。Worker
进程启动后创建的对象(onWorkerStart中创建的对象),在这个子进程存活周期之内,是常驻内存的。onConnect/onReceive/onClose 中都可以去访问它。
进程全局对象所占用的内存是在当前子进程内存堆的,并非共享内存。对此对象的修改仅在当前
Worker
进程中有效
进程期include/require的文件,在reload
后就会重新加载
会话期
onConnect
到onClose
是一次TCP的会话周期,http keep-alive时,一个连接可能会有多个request。
http是无状态的,一个用户可能也不止一个连接,可以通过创建一个session来关联同一个用户的不同请求。
请求期
请求期就是指一个完整的请求发来,也就是onReceive
收到请求开始处理,直到返回结果发送response
。这个周期所创建的对象,会在请求完成后销毁。
swoole中请求期对象与普通PHP程序中的对象就是一样的。请求到来时创建,请求结束后销毁。
总结
在Swoole中,一个work进程处理完请求后并不会销毁(甚至可能同时处理多个请求),所以务必要明确你创建的变量的生命周期,以防止出现逻辑上的问题。
免费教程手写不易,希望能支持一下SW-X框架,(^.^)
GitHub有账号的朋友,也可以给我们一个小星星噢!
该群以Swoole生态发展交流为主,若出现争吵,攻击其他人等行为,立即剔除。