Swoole 面试题总结
swoole提升性能
1.进程常驻内存:
swoole本⾝是进程常驻内存,在进程启动的时候就将PHP框架等代码读取并编译完成,不需要每次启动的时候都执⾏编译步骤,⼤⼤降低了脚本的运⾏时间;
2.连接池
php-fpm的模式php因为每次请求结束时都会销毁所有资源,因此⽆法使⽤连接池;⽽基于swoole的进程常驻内存模式,可以通过连接池的⽅式来加速程序,使⽤连接池既可以降低程序的响应时间,⼜可以有效保护后端资源。
3.可以使⽤协程处理异步IO
当开发中需要去请求多处的数据,⽽每⼀块的数据单独请求都要花较长时间,常规的php-fpm是阻塞式运⾏,⽆法对这类型的数据处
理进⾏加速;⽽基于swoole的程序,可以将这类的业务并⾏化处理,并⾏去请求后端的数据源,能够⼤⼤优化了此类业务的运⾏时间。
swoole⾥的协程是什么,怎么⽤?为什么协程可以提⾼并发
协程是通过协作⽽不是抢占的⽅式来进⾏切换,它创建和切换对内存等资源⽐线程⼩的多(可以理解为更⼩的线程);
协程的使⽤是通过Swoole\Coroutine或者Co\命名空间短命名简化类名来创建;
协程可以异步处理任务,⽀持并发,并且资源消耗⼩
⽤了swoole以后,会不会发⽣内存泄漏?如果发⽣了怎么解决?
swoole由于是常驻内存,⼀旦资源加载进⼊后,会⼀直存在于内存中。对于局部变量,swoole会在回调函数结束后⾃动释放;对于全局变量(lobal声明的变量,static声明的对象属性或者函数内的静态变量和超全局变量),swoole不会⾃动释放;因此操作不好会发⽣内存泄漏。
解决
1.在onClose的时候释放
2.在 Swoole 中,可以使用 max_request 和 task_max_request 来避免内存泄露。这个两个参数如下:
max_request:表示 worker 进程的最大任务数量,当 worker 进程处理的任务数量超过这个参数值时,worker 进程自动退出,如此就达到了释放内存和资源的目的;task_max_request:同 max_request 一样
<?php // 13-swoole-server.php $server = new Swoole\Server('0.0.0.0', 9501, SWOOLE_PROCESS); $server->set([ 'worker_num' => 1, 'task_worker_num' => 1, 'max_request' => 2, 'task_max_reqeust' => 2, ]); $server->on('Receive', function ($server, $fd, $fromId, $data) { $server->task($data); }); $server->on('Task', function ($server, $taskId, $fromId, $data) { }); $server->on('Finish', function ($server, $taskId, $data) { }); $server->start();
缺点
max_request 只能用于同步阻塞,无状态的请求响应式服务
纯异步的server不应该设置max_request
使用Base模式时,max_request无效
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了