首页
归档
朋友
关于我
留言
【Wiki知识库】
Search
1
虚拟机无法ping不通百度,并无法访问浏览器
4,451 阅读
2
mysql使用or条件使索引失效
3,348 阅读
3
mysql如何在一对多查询时选取时间最近的一条记录
2,699 阅读
4
根据MySQL获取当天,昨天,本周,本月,上周,上月,本月的起始时间
2,166 阅读
5
git常用命令大全
1,564 阅读
PHP
面向对象
设计模式
知识汇总
常用函数
PHP框架知识
数据库
MySQL
服务器
Docker
虚拟机
Nginx
缓存相关
Redis
前端
中间件
RabbitMQ
网络编程
HTTP相关
Swoole
Workerman
工具软件
Git
Typecho
杂乱无章
面试指南
PHP相关
MySQL面试汇总
中间件相关
开发技巧 | 优化
Search
标签搜索
php
mysql
代码片段
linux
Thinkphp
Redis
nginx
mysql优化
docker
面试指南
面向对象
git
Laravel框架
http协议
RabbitMQ
Redis性能优化
设计模式
linux命令
编译安装
PhpSpreadsheet
黎明强
累计撰写
70
篇文章
累计收到
58
条评论
首页
栏目
PHP
面向对象
设计模式
知识汇总
常用函数
PHP框架知识
数据库
MySQL
服务器
Docker
虚拟机
Nginx
缓存相关
Redis
前端
中间件
RabbitMQ
网络编程
HTTP相关
Swoole
Workerman
工具软件
Git
Typecho
杂乱无章
面试指南
PHP相关
MySQL面试汇总
中间件相关
开发技巧 | 优化
页面
归档
朋友
关于我
留言
搜索到
1
篇与
PHP相关
的结果
2022-11-08
Swoole面试题汇总
为什么你要用swoole,能解决你项目中的哪些痛点?swoole是一个网络通讯和异步IO的引擎,一个基础库;swoole相比于apache/fpm,主要节省了PHP框架和全局对象每次创建销毁带来的性能开销,是进程常驻内存型。Swoole的应用场景可以实现高性能的http server处理 ,因为是常驻行内存,减少在每次请求初始化建立连接的性能开销。可以实现webscoket 跟web双向通讯。swoole的task模块可以做一些异步任务投递,慢速任务、耗时场景 (比如广播、发送群邮件),这些任务丢给task进程后,worker进程就继续处理新的数据请求。也可以用swoole实现一些定时任务,支持毫秒级别的。你是如何通过swoole提升性能的,怎么做的?进程常驻内存:swoole本身是进程常驻内存,在进程启动的时候就将PHP框架等代码读取并编译完成,不需要每次启动的时候都执行编译步骤,大大降低了脚本的运行时间;连接池php-fpm的模式 php因为每次请求结束时都会销毁所有资源,因此无法使用连接池;而基于swoole的进程常驻内存模式,可以通过连接池的方式来加速程序,使用连接池既可以降低程序的响应时间,又可以有效保护后端资源。可以使用协程处理异步IO当开发中需要去请求多处的数据,而每一块的数据单独请求都要花较长时间,常规的php-fpm是阻塞式运行,无法对这类型的数据处理进行加速;而基于swoole的程序,可以将这类的业务并行化处理,并行去请求后端的数据源,能够大大优化了此类业务的运行时间。为什么需要连接池?当并发量很低的时候,连接可以临时建立,但当服务吞吐达到几百、几千的时候,频繁 建立连接 Connect 和 销毁连接 Close 就有可能会成为服务的一个瓶颈,那么当服务启动的时候,先建立好若干个连接并存放于一个队列中,当需要使用时从队列中取出一个并使用,使用完后再反还到队列去,而对这个队列数据结构进行维护的,就是连接池。Swoole中的异步IO用过吗?怎么实现?为什么改成协程操作?在swoole中1x、2x版本可 以用异步IO去操作redis、mysql、文件等。但是在 swoole4+ 版本改成协程的方式,所有业务代码是同步的,但底层IO是异步的,保证并发的同时避免了传统异步回调所带来离散的代码逻辑和陷入多层回调中导致代码不好维护。但在 swoole4.3+ 后又不再推荐协程客户端的方式了,采用” 一键协程化 “ ,因为普通的协程因为这样有几个问题出现:实现复杂,每个客户端细枝末节的协议复杂,工作量巨大用户需要更改的代码比较多,比如原来查询MYSQL 用PHP的PDO,现在改成 Swoole\Coroutine\MySQL很难覆盖所有的操作,有些函数也有可能导致同步阻塞Swoole 开发组换了实现思路,采用 Hook 原生 PHP 函数的方式实现协程客户端,通过一行代码就可以让原来的同步 IO 的代码变成可以协程调度的异步 IO,即一键协程化。swoole里的协程是什么,怎么用?为什么协程可以提高并发?协程可以简单理解为线程,只不过这个线程是用户态的,不需要操作系统参与,创建销毁和切换的成本非常低协程是通过协作而不是抢占的方式来进行切换,它创建和切换对内存等资源比线程小的多(可以理解为更小的线程);协程的使用是通过Swoole\Coroutine 或者Co\命名空间短命名简化类名来创建;协程可以异步处理任务,支持并发,并且资源消耗小。什么是 channel?channel 可以理解为消息队列,只不过是协程间的消息队列,多个协程通过 push 和 pop 操作生产消息和消费消息,用来协程之间的通讯。需要注意的是 channel 是没法跨进程的,只能一个 Swoole 进程里的协程间通讯,最典型的应用是连接池和并发调用。用了swoole以后,会不会发生内存泄漏?如果发生了怎么解决?swoole由于是常驻内存,一旦资源加载进入后,会一直存在于内存中。对于局部变量,swoole会在回调函数结束后自动释放;对于全局变量(lobal声明的变量,static声明的对象属性或者函数内的静态变量和超全局变量),swoole不会自动释放;因此操作不好会发生内存泄漏。解决: - 在onClose回调内清理变量;swoole提供了max_request 和max_task_request 机制: 进程完成指定数量的任务后,会自动退出,达到释放资源和内存的目的;而后manager进程会重新拉起新worker/task进程来继续处理任务。使用限制: max_request只能用于同步阻塞、无状态的请求响应式服务器程序; 纯异步的Server不应当设置max_request 使用Base模式时max_request是无效的swoole和php-fpm的区别PHP-FPM:早期版本的 PHP 并没有内置的 WEB 服务器,而是提供了 SAPI(Server API)给第三方做对接。现在非常流行的 php-fpm 就是通过 FastCGI 协议来处理 PHP 与第三方 WEB 服务器之间的通信。比如 Nginx + php-fpm 的组合,这种方式运行的 fpm 是 Master/Worker 模式,启动一个 Master 进程监听来自 Nginx 的请求,再 fork 多个 Worker 进程处理请求。每个 Worker 进程只能处理一个请求,单一进程的生命周期大体如下:初始化模块。初始化请求。此处请求是请求 PHP 执行代码的意思,并非 HTTP 的请求。执行 PHP 脚本。结束请求。关闭模块。多进程模型是依赖进程数来解决并发问题,一个进程只能处理一个连接,当启动大量进程,进程调度消耗可能占 CPU 的百分之几十甚至 100%,比如 C10K 问题,多进程模型就力不从心了。Swoole:Swoole 采用的也是 Master/Worker 模式,不同的是 Master 进程有多个 Reactor 线程Master 只是一个事件发生器,负责监听 Socket 句柄的事件变化。Worker 以多进程的方式运行,接收来自 Reactor 线程的请求,并执行回调函数(PHP 编写的)。启动 Master 进程的流程大致是:初始化模块。初始化请求。因为 swoole 需要通过 cli 的方式运行,所以初始化请求时,不会初始化 PHP 的全局变量,如 $_SERVER, $_POST, $_GET 等。执行 PHP 脚本。包括词法、语法分析,变量、函数、类的初始化等,Master 进入监听状态,并不会结束进程。Swoole 加速的原理由 Reactor(epoll 的 IO 复用方式)负责监听 Socket 句柄的事件变化,解决高并发问题。通过内存常驻的方式节省 PHP 代码初始化的时间,在使用笨重的框架时,用 swoole 加速效果是非常明显的。对比不同PHP-FPMMaster 主进程 / Worker 多进程模式。启动 Master,通过 FastCGI 协议监听来自 Nginx 传输的请求。每个 Worker 进程只对应一个连接,用于执行完整的 PHP 代码。PHP 代码执行完毕,占用的内存会全部销毁,下一次请求需要重新再进行初始化等各种繁琐的操作。只用于 HTTP Server。SwooleMaster 主进程(由多个 Reactor 线程组成)/ Worker 多进程(或多线程)模式启动 Master,初始化 PHP 代码,由 Reactor 监听 Socket 句柄的事件变化。Reactor 主线程负责子多线程的均衡问题,Manager 进程管理 Worker 多进程,包括 TaskWorker 的进程。每个 Worker 接受来自 Reactor 的请求,只需要执行回调函数部分的 PHP 代码。只在 Master 启动时执行一遍 PHP 初始化代码,Master 进入监听状态,并不会结束进程。不仅可以用于 HTTP Server,还可以建立 TCP 连接、WebSocket 连接。
2022年11月08日
160 阅读
1 评论
0 点赞