PHP面试宝典之Swoole
swoole多线程编程
swoole的使用:安装swoole扩展,会与xDebug扩展产生冲突,不支持Windows系统,可以在虚拟机或Mac环境安装
swoole中全局变量都无效,比如: S E S S I O N , _SESSION, SESSION,_COOKIE,$_GET等
swoole中普通的sleep等待函数会将整个进程暂停,可以使用协程的模式使用sleep,这样让当前的协程程序等待,不影响整个进程
Swoole-http
Swoole-http服务端:浏览器访问:服务器IP:端口号1:$http = new Soole\Http\Server(‘0.0.0.0’,端口);实例化对象2:$http->set();设置Swoole属性,比如:几个进程3:$http->on(‘Request’, function($request, $response){//客户端请求时触发;多进程时,并行处理;end输出数据到客户端$response->end();});4:$http->satrt();开启服务
Swoole-tcp客户端:同步阻塞客户端
Swoole-tcp客户端:同步阻塞客户端1:$client = new Swoole\Client(SWOOLE_SOCK_TCP);实例化客户端对象2:if (!$client->connect(‘127.0.0.1’, 端口号, )){//连接服务端不成功}3:$client->send();向服务端发送数据4:$data = $client->recv();接收到服务端数据5:$client->close();关闭客户端
Swoole-tcp服务端:命令访问:telnet 服务器IP 端口号
1:$server = new Swoole\Server(‘0.0.0.0’, 端口号);实例化tcp对象2:$server->on(‘Connect’, function($server, $fd){//与客户端建立连接时触发});3:$server->on(‘Receive’, function($server, $fd, $reactor_id, $data){//接收到客户端数据时触发,$fd:客户端唯一标识,$data:客户端发送的数据$server->send($fd, ‘发送给客户端的数据’);});4:$server->on(‘Close’, function($server, $fd){//连接关闭时触发});5:$server->start();启动服务
Swoole-udp客户端:
1:$client = new Swoole\Client(SWOOLE_SOCK_UDP);实例化客户端对象2:$client->sendto(‘ip’, 端口,发送信息);向服务端发送数据3:$data = $client->recv();接收到服务端数据
Swoole-udp服务端:命令行运行:nc -vuz 服务器IP 端口号
1:$http = new Soole\Http\Server(‘0.0.0.0’,端口, SWOOLE_PROCESS, SWOOLE_SOCK_UDP);实例化对象2:$http->on(‘Packet’, function($server, $data, $clientInfo){//接收到客户端数据时触发;//$clientInfo[‘address’]:客户端地址//$clientInfo[‘port’]:客户端临时端口号//$data:客户端发送的数据$server->sendto($clientInfo[‘address’], $clientInfo[‘port’], ‘发送给客户端的数据’);});3:$server->satrt();开启服务
Swoole-WebSocket服务端:
1:$ws = new Swoole\WebSocket\Server(‘0.0.0.0’, 端口号);2:$ws->on(‘Open’, function($ws, $request){//监听websocket连接打开事件});3:$ws->on(‘Message’, function($ws, $frame){//接受到客户端消息时触发$ws->push($frame->fd, ‘向客户端发送消息’)});4:$ws->on(‘Close’,function($ws, $fd){//关闭连接时触发});5:$ws->start();开启服务
Swoole-WebSocket客户端:
1:var wsServer = ‘ws://ip:端口号’;定义连接协议2:var websocket = new WebSocket(wsServer);初始化对象3:websocket.onopen = function() {//连接成功时,触发};4:websocket.onclose = function(){//关闭连接时触发}5:websocket.onmessage = function() {//接受服务端发送的消息}6:websocket.onerror = function () {//服务出错时触发}7:websocket.send(‘向服务端发送消息’);
为什么要用swoole?解决了哪些项目痛点?
高并发问题:传统PHP处理高并发时,会遇到阻塞io的问题,导致CPU利用率低下,swoole的异步io模型可以有效地解决这个问题,提升应用的性能和响应能力
大规模数据处理问题:传统PHP需要占用大量内存和CPU资源,导致应用运行缓慢,甚至崩溃。swoole提供了协程和异步编程模型,可以更加高效和稳定。
长连接问题:传统PHP处理长连接,需要占用大量服务器资源,导致服务器压力过大,swoole的长连接可以大大降低服务器资源占用,提供性能和可靠性
分布式协作问题:swoole提供了基于协程的并发编程模型,可以让PHP更加容易实现分布式协作,从而提高可扩展性和可维护性
如何通过swoole提升性能?
使用异步io:swoole的异步io可以让PHP应用程序避免阻塞式io,从而提高应用程序的吞吐量和并发性能
使用协程:可以避免上下文切换的开销,提高响应速度和性能
使用swoole内置http服务器:替代传统架构,减少系统开销,提高性能
使用swoole连接池:可以有效地管理数据库连接和Redis连接,避免频繁地创建和销毁,从而提高性能和稳定性
使用swoole异步任务和定时器:可以在执行耗时操作时不会阻塞主线程,从而提高响应速度和性能
使用swoole的WebSocket服务器:可以实时通信,代替传统的轮询方式,提高性能和用户体验
swoole 里的协程是什么?怎么用?为什么协程可以提高并发?
协程:
是一种轻量级线程,可以在单线程下实现多任务并发执行。协程通过协作方式,避免了线程上下文切换所带来的高额开销,从而实现了更高的性能。协程调度不依赖于操作系统,而是由程序自己控制
使用:
可以通过co rou tine模块创建协程,并使用yiel d关键字在协程中进行阻塞操作。(Co\run闭包中创建)
协程提高并发的原因:
主要是可以避免多线程上下文切换的开销,线程切换会涉及到寄存器、堆、栈等多个上下文的保存和恢复,而协程在运行时只需要保存当前协程的上下文,因此切换时开销更小。此外,协程可以通过事件循环来处理多个连接的请求,避免了频繁的网络io操作所带来的阻塞和线程切换
swoole是一个异步网络通讯引擎,一个基础库,主要节省了php框架和全局对象每次创建销毁带来的性能开销,是进程常驻内存型
如何通过swoole提升性能?
进程常驻内存,在进程启动的时候读取代码并编译完成,不需要每次启动都执行编译步骤,大大降低了脚本的运行时间
连接池,PHP-fpm进程管理器每次请求结束都会销毁资源,不能使用连接池,而基于swoole的进程常驻内存模式,就可以使用连接池加速程序
可以使用协程处理异步:开发中需要请求多处数据,每一块都要消耗挺长时间,swoole可以并行处理,大大优化了业务的运行时间
swoole里的协程是什么
可以理解为更小的线程,通过协作而不是抢占的方式进行切换,消耗资源比线程更小
协程通过co\命名空间 简化类名创建
协程可以异步处理任务,支持并发,并且资源消耗小
使用swoole会不会发生内存泄漏?怎么解决?
有可能,因为是常驻内存,局部变量在函数结束后会自动释放,但全局变量和静态变量不会自动释放,所以有可能因为操作不挡发生内存泄漏
解决:
1:在onclose回调内清理变量
swoole提供了两种机制可以在进程完成指定数量的任务后,会自动退出,达到释放资源和内存的目的,而后进程会重新拉起新的进程来处理任务
PHP是一个解释型语言,多进程单线程(需要使用其他扩展可以成为多线程),php使用php-fpm进程管理工具接收和处理nginx请求,有一个主进程master,负责创建、销毁子进程,分发http请求给子进程,多个子进程worker负责处理http请求,一个子进程里一个线程
php进程的数量如何控制或分配?
php进程模式可以分为静态模式和动态模式两种;
静态模式:固定死的进程数,不会变化,占用内存高
动态模式:设置区间,最小进程数和最大进程数,根据请求量自动调节
进程和线程的区别?
进程:是程序分配和管理资源的基本单位
线程:程序运行的基本单位,是进程的一个执行单元
协程:比线程更加轻量级,是线程调度的基本单位,栈会自动伸缩
进程之间资源内存相互独立,同一进程内的线程可以共享资源
进程切换开销比较大,线程之间切换开销小
进程崩溃,不会影响其他进程,但线程崩溃整个进程都会挂掉
进程有自己的程序运行的入口、顺序执行序列和程序出口,但线程不能独立执行,必须依存在应用程序中,由应用程序提供了多个线程执行控制
僵尸进程:子进程退出了,但父进程并没有获取子进程的状态,这就是僵尸进程
孤儿进程:父进程退出了,而它的子进程还在运行,子进程被init进程收养
僵尸进程解决:发送信号的方式,kill父进程,让僵尸进程变成孤儿进程,被init回收
进程和线程:
进程像火车,线程像车厢,一个进程可以有多个线程,同一进程内不同线程之间可以进行数据共享,不同进程之间的线程数据不可共享
线程之间是如何通信的?
线程间共享内存,通过全局变量通信,通过message进行通信
RESTFULL(restfull):
RESTful是一种常见的REST应用,是遵循REST风格的web服务。
Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
特点:简洁 高效 安全
接口规范:
使用https协议
专属域名
将版本号放在url或http请求头中
网址中不能有动词,只能有名词,一般对应表名
请求类型有http动词表示get(select)、post(create)、put(update)、patch(update)、delete(delete)、
过滤信息limit、offset、page、per_page、sortby order、
状态码200(OK)、201(新建或修改成功)、202(异步任务排队中)、204(删除数据成功)、400(用户请求错误,服务器没处理)、401(没权限、令牌、用户名、密码错误)、403(有权限,但禁止访问)、404(请求不存在数据)、406(请求格式错误)、410(请求资源被删除)、422(创建对象时,验证出错)、500(服务器错误,用户无法判断请求是否成功)
错误处理,4开头状态码返回给客户端
返回结果
get/collection(资源列表)
get/collection/resource(单个对象)
post/collection(新创建的对象)
put/collection/resource(完整的对象)
patch/collection/resource(完整的对象)
delete/collection/resource(空文档)
返回结果中包含链接,提供其他api的方法,让用户知道下一步该怎么做
身份认证应该使用OAuth2.0框架,数据格式使用json
来源地址:https://blog.csdn.net/qq_38989173/article/details/130450427
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341