我的编程空间,编程开发者的网络收藏夹
学习永远不晚

PHP面试宝典之Swoole

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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);实例化客户端对象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

PHP面试宝典之Swoole

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python面试宝典之基础篇-02

我觉得你如果正在找工作,我的Python面试宝典几期教程,你一定得花时间看完了!
2023-06-01

Python面试宝典之基础篇-04

接着更新Python常见的面试题!
2023-06-01

Sql面试宝典带答案

一、试用SQL查询语句表达下列对教学数据库中三个基本表 S、SC 、C 的查询:S(sno,sname,SAGE,SSEX) 各字段表示学号,姓名,年龄,性别Sc(sno,cno,grade) 各字段表示学号,课程号,成绩、C(cno,cname, TEACH
Sql面试宝典带答案
2015-01-21

面试宝典_Python.常规算法.000

面试题目:1. 用PYTHON实现一个扁平化的字典,如{'a': {'b': '1'}}扁平化处理后变成{'a.b': 1}?解题思路:1. 由于字典可能是无限嵌套的,所以第一印象就想到采用递归函数完成,由于扁平化数据需要零时存储以及永久存
2023-01-31

Oracle面试宝典-等待事件篇

Oracle面试宝典-等待事件篇请问Oracle数据库中等待事件的作用是什么?一、等待事件由来因为指标体系的发展,才导致等待事件的引入。总结一下,Oracle的指标体系,大致经历了下面三个阶段:(1)以命中率为主要参考指标以各
2022-11-30

面试宝典_Python.运维开发.000

面试题目:1. 用PYTHON实现tail -f功能,默认显示最后15行,实时输出新增行?解题思路:1. 此需求在很多场景中都有遇到,而且在各大群中也被讨论过,虽然有现成的模版如pyinotify等模块实现,但面试更想通过你的解题思路来判断
2023-01-31

【2022最新Java面试宝典】—— SpringCloud面试题(49道含答案)

目录 Spring Cloud1. 什么是微服务架构2. 为什么需要学习Spring Cloud3. Spring Cloud 是什么4. SpringCloud的优缺点5. SpringBoot和SpringCloud的区别?6.
2023-08-18

【2022最新Java面试宝典】—— SpringBoot面试题(44道含答案)

目录 1. 什么是 Spring Boot?2. 为什么要用SpringBoot3. SpringBoot与SpringCloud 区别4. Spring Boot 有哪些优点?5. Spring Boot 的核心注解是哪个?它主要
2023-08-17

Android源码面试宝典之JobScheduler从使用到原理分析(四)【JobScheduler、StateController 】

上文,从Job任务的创建,到如何与JSC(JobServiceCotext)关联,到具体任务的绑定、执行进行了源码探索,相信大家到现在为止,对于JobScheduler的庐山真面目,脑海中已经有了些许自己的轮廓。但是,我们也知道,目前为
2023-08-19

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录