Swoole 面试题总结

发布时间 2023-05-27 18:08:12作者: bilzzard

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无效