返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP面试宝典之Swoole
  • 283
分享到

PHP面试宝典之Swoole

php面试swoole 2023-08-31 05:08:34 283人浏览 安东尼
摘要

swoole多线程编程 swoole的使用:安装swoole扩展,会与xDebug扩展产生冲突,不支持windows系统,可以在虚拟机或Mac环境安装 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

--结束END--

本文标题: PHP面试宝典之Swoole

本文链接: https://lsjlt.com/news/384226.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • PHP面试宝典之Swoole
    swoole多线程编程 swoole的使用:安装swoole扩展,会与xDebug扩展产生冲突,不支持Windows系统,可以在虚拟机或Mac环境安装 swoole中全局变量都无效,比如: ...
    99+
    2023-08-31
    php 面试 swoole
  • PHP面试宝典之PHP篇
    PHP数组函数? array_merge(合并) array_unique(去重) array_intersect(交集) array_diff(差集) array_map(回调) array_val...
    99+
    2023-09-14
    php 面试 开发语言
  • PHP面试宝典之Laravel篇
    artisan常用命令? 查看laravel版本:php artisan --version重启队列:php artisan queue:restart监听队列:php artisan queue:l...
    99+
    2023-09-11
    php 面试 laravel
  • PHP面试宝典2023
    php面试时经常会问一些理论性的问题,给大家整理了些,很多都是网上找的,难免有不严谨的地方,望请大家指正,共勉 mysql innodb和myisam是存储格式: myisam: .frm: ...
    99+
    2023-09-07
    php 面试 数据库
  • PHP面试宝典之高并发、负载均衡
    什么是高并发、高性能、高可用? 高并发:系统能够同时并行处理很多请求(同一时间内大量的网络请求),指标:响应时间,吞吐量,每秒查询率,并发用户数 高性能:程序处理速度快,所占内存少、cpu占用率低。 ...
    99+
    2023-09-10
    php 面试 负载均衡
  • Python面试宝典之基础篇-04
    接着更新Python常见的面试题!...
    99+
    2023-06-01
  • Python面试宝典之基础篇-02
    我觉得你如果正在找工作,我的Python面试宝典几期教程,你一定得花时间看完了!...
    99+
    2023-06-01
  • Sql面试宝典带答案
    一、试用SQL查询语句表达下列对教学数据库中三个基本表 S、SC 、C 的查询: S(sno,sname,SAGE,SSEX) 各字段表示学号,姓名,年龄,性别 Sc(sno,cno,grade) 各字段表示学号,课程号,成...
    99+
    2015-01-21
    Sql面试宝典带答案
  • PHP面试宝典之Mysql数据库高级篇(二)主从复制
    主从复制的原理? 主服务器写,从服务器读; 主服务器将更新语句记录到日志中,从服务器获取主服务器的日志,并写入到自己日志中,从服务器的sql线程监控从服务器日志情况,发现变化,就对日志进行解析并执行 ...
    99+
    2023-09-04
    数据库 mysql php
  • Oracle面试宝典-进程结构篇
    Oracle 面试宝典 - 进程结构篇 Oracle 数据库是以单进程还是多进程方式运行的? 在Windows 平台下, Oracle 数据库是以单进程 (oracle.exe) 多线程方...
    99+
    2024-04-02
  • 面试宝典_Python.运维开发.000
    面试题目:1. 用PYTHON实现tail -f功能,默认显示最后15行,实时输出新增行解题思路:1. 此需求在很多场景中都有遇到,而且在各大群中也被讨论过,虽然有现成的模版如pyinotify等模块实现,但面试更想通过你的解题思路来判断这...
    99+
    2023-01-31
    宝典 _Python
  • 面试宝典_Python.常规算法.000
    面试题目:1. 用PYTHON实现一个扁平化的字典,如{'a': {'b': '1'}}扁平化处理后变成{'a.b': 1}解题思路:1. 由于字典可能是无限嵌套的,所以第一印象就想到采用递归函数完成,由于扁平化数据需要零时存储以及永久存储...
    99+
    2023-01-31
    算法 常规 宝典
  • Oracle面试宝典-等待事件篇
    Oracle 面试宝典 - 等待事件篇 请问Oracle 数据库中等待事件的作用是什么 一、等待事件由来 因为指标体系的发展,才导致等待事件的引入。总结一下,Oracle 的指标体系...
    99+
    2022-11-30
    oracle 事件 宝典
  • 【2022最新Java面试宝典】—— MySQL面试题(40道含答案)
    目录 1、MySQL 中有哪几种锁?2、MySQL 中有哪些不同的表格?3、简述在MySQL 数据库中 MyISAM 和InnoDB 的区别4、MySQL 中InnoDB 支持的四种事务隔离级...
    99+
    2023-09-03
    java 面试 mysql
  • 【2022最新Java面试宝典】—— SpringCloud面试题(49道含答案)
    目录 Spring Cloud1. 什么是微服务架构2. 为什么需要学习Spring Cloud3. Spring Cloud 是什么4. SpringCloud的优缺点5. SpringBoot和SpringCloud的区别?6....
    99+
    2023-08-18
    SpringCloud 面试
  • 【2022最新Java面试宝典】—— SpringBoot面试题(44道含答案)
    目录 1. 什么是 Spring Boot?2. 为什么要用SpringBoot3. SpringBoot与SpringCloud 区别4. Spring Boot 有哪些优点?5. Spring Boot 的核心注解是哪个?它主要...
    99+
    2023-08-17
    SpringBoot 面试题
  • 软件测试面试必杀篇:【2023软件测试面试八股文宝典】
    800道软件测试面试真题,高清打印版打包带走,横扫软件测试面试高频问题,涵盖测试理论、Linux、MySQL、Web测试、接口测试、App测试、Python、Selenium、性能测试、LordRunner、计算机网络、数据结构与算法、逻辑...
    99+
    2023-08-31
    单元测试 压力测试 python
  • 【揭秘】数据库面试葵花宝典,让你面试一次过
    大家可以叫我老张,网名superZS!一直从事数据库行业10余年,工作于某数据库服务公司,兼数据库资深讲师,就面试中大家遇到的比较困惑的数据库问题,和刚进入数据库领域的同学们,我在这里给大家做一个详细的总结...
    99+
    2024-04-02
  • PHP经典面试题有哪些
    这篇文章给大家分享的是有关PHP经典面试题有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.合并两个数组有几种方式,试比较它们的异同方式:array_merge()’+’array_merge_recurs...
    99+
    2023-06-15
  • 面试宝典:PHP 日志相关知识点详解和答题技巧!
    PHP 日志相关知识点详解和答题技巧 在 PHP 开发中,日志记录是很重要的一部分,它可以帮助开发者快速定位问题和分析系统运行情况。在面试中,PHP 日志相关问题也是非常常见的,下面我们来详细了解一下 PHP 日志相关知识点和答题技巧。 一...
    99+
    2023-08-04
    日志 学习笔记 面试
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作