文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

PHP面试宝典之Swoole

2023-08-31 05:42

关注

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);实例化客户端对象2if (!$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客户端:

1var wsServer = ‘ws://ip:端口号’;定义连接协议2var 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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯