• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

PHP面试宝典:Swoole

武飞扬头像
书生及第
帮助1

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?解决了哪些项目痛点?

1:高并发问题:传统PHP处理高并发时,会遇到阻塞io的问题,导致CPU利用率低下,swoole的异步io模型可以有效地解决这个问题,提升应用的性能和响应能力

2:大规模数据处理问题:传统PHP需要占用大量内存和CPU资源,导致应用运行缓慢,甚至崩溃。swoole提供了协程和异步编程模型,可以更加高效和稳定。

3:长连接问题:传统PHP处理长连接,需要占用大量服务器资源,导致服务器压力过大,swoole的长连接可以大大降低服务器资源占用,提供性能和可靠性

4:分布式协作问题:swoole提供了基于协程的并发编程模型,可以让PHP更加容易实现分布式协作,从而提高可扩展性和可维护性

如何通过swoole提升性能?

1:使用异步io:swoole的异步io可以让PHP应用程序避免阻塞式io,从而提高应用程序的吞吐量和并发性能

2:使用协程:可以避免上下文切换的开销,提高响应速度和性能

3:使用swoole内置http服务器:替代传统架构,减少系统开销,提高性能

4:使用swoole连接池:可以有效地管理数据库连接和Redis连接,避免频繁地创建和销毁,从而提高性能和稳定性

5:使用swoole异步任务和定时器:可以在执行耗时操作时不会阻塞主线程,从而提高响应速度和性能

6:使用swoole的WebSocket服务器:可以实时通信,代替传统的轮询方式,提高性能和用户体验

swoole 里的协程是什么?怎么用?为什么协程可以提高并发?

协程:
是一种轻量级线程,可以在单线程下实现多任务并发执行。协程通过协作方式,避免了线程上下文切换所带来的高额开销,从而实现了更高的性能。协程调度不依赖于操作系统,而是由程序自己控制

使用:
可以通过co rou tine模块创建协程,并使用yiel d关键字在协程中进行阻塞操作。(Co\run闭包中创建)

协程提高并发的原因:
主要是可以避免多线程上下文切换的开销,线程切换会涉及到寄存器、堆、栈等多个上下文的保存和恢复,而协程在运行时只需要保存当前协程的上下文,因此切换时开销更小。此外,协程可以通过事件循环来处理多个连接的请求,避免了频繁的网络io操作所带来的阻塞和线程切换

swoole是一个异步网络通讯引擎,一个基础库,主要节省了php框架和全局对象每次创建销毁带来的性能开销,是进程常驻内存型

如何通过swoole提升性能?

1:进程常驻内存,在进程启动的时候读取代码并编译完成,不需要每次启动都执行编译步骤,大大降低了脚本的运行时间

2:连接池,PHP-fpm进程管理器每次请求结束都会销毁资源,不能使用连接池,而基于swoole的进程常驻内存模式,就可以使用连接池加速程序

3:可以使用协程处理异步:开发中需要请求多处数据,每一块都要消耗挺长时间,swoole可以并行处理,大大优化了业务的运行时间

swoole里的协程是什么

可以理解为更小的线程,通过协作而不是抢占的方式进行切换,消耗资源比线程更小

协程通过co\命名空间 简化类名创建

协程可以异步处理任务,支持并发,并且资源消耗小

使用swoole会不会发生内存泄漏?怎么解决?

有可能,因为是常驻内存,局部变量在函数结束后会自动释放,但全局变量和静态变量不会自动释放,所以有可能因为操作不挡发生内存泄漏

解决:
1:在onclose回调内清理变量

2:swoole提供了两种机制可以在进程完成指定数量的任务后,会自动退出,达到释放资源和内存的目的,而后进程会重新拉起新的进程来处理任务

PHP是一个解释型语言,多进程单线程(需要使用其他扩展可以成为多线程),php使用php-fpm进程管理工具接收和处理nginx请求,有一个主进程master,负责创建、销毁子进程,分发http请求给子进程,多个子进程worker负责处理http请求,一个子进程里一个线程

php进程的数量如何控制或分配?

php进程模式可以分为静态模式和动态模式两种;

静态模式:固定死的进程数,不会变化,占用内存高

动态模式:设置区间,最小进程数和最大进程数,根据请求量自动调节

进程和线程的区别?

1:
进程:是程序分配和管理资源的基本单位

线程:程序运行的基本单位,是进程的一个执行单元

协程:比线程更加轻量级,是线程调度的基本单位,栈会自动伸缩

2:进程之间资源内存相互独立,同一进程内的线程可以共享资源

3:进程切换开销比较大,线程之间切换开销小

4:进程崩溃,不会影响其他进程,但线程崩溃整个进程都会挂掉

5:进程有自己的程序运行的入口、顺序执行序列和程序出口,但线程不能独立执行,必须依存在应用程序中,由应用程序提供了多个线程执行控制

僵尸进程:子进程退出了,但父进程并没有获取子进程的状态,这就是僵尸进程

孤儿进程:父进程退出了,而它的子进程还在运行,子进程被init进程收养

僵尸进程解决:发送信号的方式,kill父进程,让僵尸进程变成孤儿进程,被init回收

进程和线程:
进程像火车,线程像车厢,一个进程可以有多个线程,同一进程内不同线程之间可以进行数据共享,不同进程之间的线程数据不可共享

线程之间是如何通信的?

线程间共享内存,通过全局变量通信,通过message进行通信

RESTFULL(restfull):

RESTful是一种常见的REST应用,是遵循REST风格的web服务。

Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

特点:简洁 高效 安全

接口规范:

1:使用https协议

2:专属域名

3:将版本号放在url或http请求头中

4:网址中不能有动词,只能有名词,一般对应表名

5:请求类型有http动词表示get(select)、post(create)、put(update)、patch(update)、delete(delete)、

6:过滤信息limit、offset、page、per_page、sortby order、

7:状态码200(OK)、201(新建或修改成功)、202(异步任务排队中)、204(删除数据成功)、400(用户请求错误,服务器没处理)、401(没权限、令牌、用户名、密码错误)、403(有权限,但禁止访问)、404(请求不存在数据)、406(请求格式错误)、410(请求资源被删除)、422(创建对象时,验证出错)、500(服务器错误,用户无法判断请求是否成功)

8:错误处理,4开头状态码返回给客户端

9:返回结果
get/collection(资源列表)

get/collection/resource(单个对象)

post/collection(新创建的对象)

put/collection/resource(完整的对象)

patch/collection/resource(完整的对象)

delete/collection/resource(空文档)

10:返回结果中包含链接,提供其他api的方法,让用户知道下一步该怎么做

11:身份认证应该使用OAuth2.0框架,数据格式使用json

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfbkib
系列文章
更多 icon
同类精品
更多 icon
继续加载