面试官:swoole 的认识和强大之处你不知道?回去吧!!!

首先 swoole 是 php 的一个扩展程序

swoole 是一个为 php 用 c 和 c++ 编写的基于事件的高性能异步 & 协程并行网络通信引擎

swoole 是一个多进程模型的框架,当启动一个进程 swoole 应用时,一共会创建 2+n+m 个进程,n 为 worker 进程数,m 为 TaskWorker 进程数,1 个 master 进程和一个 manager 进程,关系如下图所示

Master 进程为主进程,该进程会创建 Manager 进程、Reactor 线程等工作进 / 线程

1、Reactor 线程:

  • 负责维护客户端 TCP 连接、处理网络 IO、处理协议、收发数据
  • 完全是异步非阻塞的模式
  • 全部为 C 代码,除 Start/Shudown 事件回调外,不执行任何 PHP 代码
  • TCP 客户端发来的数据缓冲、拼接、拆分成完整的一个请求数据包
  • Reactor 以多线程的方式运行

2、Worker 进程:

  • 接受由 Reactor 线程投递的请求数据包,并执行 PHP 回调函数处理数据
  • 生成响应数据并发给 Reactor 线程,由 Reactor 线程发送给 TCP 客户端
  • 可以是异步非阻塞模式,也可以是同步阻塞模式
  • Worker 以多进程的方式运行

3、TaskWorker 进程 :

  • 接受由 Worker 进程通过 swoole_server->task/taskwait 方法投递的任务
  • 处理任务,并将结果数据返回(使用 swoole_server->finish)给 Worker 进程
  • 完全是同步阻塞模式
  • TaskWorker 以多进程的方式运行

A: 网络通信引擎

网络通信引擎,是为 php 提供网络通信能力的,传统的 php 程序都是启动 php-fpm,前边再有一层 nginx 或者 apache,打开浏览器访问就 OK,但是从浏览器访问到服务器这一阶段涉及到了网络强求,但是这一阶段跟 php 脚本没有任何的关系,php 只需要处理好数据生成需要展示的内容就完成使命了,声明周期当中,请求到来前和请求完成后都没有 php 脚本什么事,而 swoole 提供的一大能力就是扩展了 php 的生命周期,无需 php-fpm 或者 nginx 或者 apache 之类的工具帮助就可以启动一个 web 服务,并且从服务启动前,启动后,链接进入,请求到来,请求结束,链接切断,服务终止都在 php 脚本的掌控之中,这样的话 php 脚本就会涉及到大量的网络通讯处理,而这个网络通讯处理的能力正是来源于 swoole! 网络通信引擎,是为 php 提供网络通信能力的,传统的 php 程序都是启动 php-fpm,前边再有一层 nginx 或者 apache,打开浏览器访问就 OK,但是从浏览器访问到服务器这一阶段涉及到了网络强求,但是这一阶段跟 php 脚本没有任何的关系,php 只需要处理好数据生成需要展示的内容就完成使命了,声明周期当中,请求到来前和请求完成后都没有 php 脚本什么事,而 swoole 提供的一大能力就是扩展了 php 的生命周期,无需 php-fpm 或者 nginx 或者 apache 之类的工具帮助就可以启动一个 web 服务,并且从服务启动前,启动后,链接进入,请求到来,请求结束,链接切断,服务终止都在 php 脚本的掌控之中,这样的话 php 脚本就会涉及到大量的网络通讯处理,而这个网络通讯处理的能力正是来源于 swoole!

B:基于事件的高性能异步

同步:

就拿读取文件内容来说吧

file_get_contents () 执行完才能执行下边的代码 这样就很容易造成程序的阻塞

否则下边的代码就无法输出文件的内容

传统 php 都是这样阻塞式的顺序执行的

这是常见的同步编程

异步:

代码在执行到 ajax 的时候,函数会直接返回,你马上就可以看到屏幕上打印出的 lol

这就是异步,这样你永远不会被 IO 阻塞,但是它带来了新的问题,在你运行到 lol 之后你就不知道现在代码运行到哪里去了,你只能等待回调被触发,然后屏幕上打印响应的 log, 它的执行不是单层顺序的,而是嵌套的

如果在业务代码当中 这样层层嵌套可读性可想而知

当然这是前端异步请求后端接口

swoole 当中处理异步回调嵌套使用的是协程

你知道什么叫协程吗?你知道线程是干啥的吗?你又知道进程吗?

如果想深入了解 swoole 的强大之处 你还得要了解传统 php 的 lnmp 环境的整套运行机制,这些你都了解吗?

目前 swoole 当中的异步也是协程化的,所以你必须充分理解协程到底是个什么东西!

C:协程

到底什么是协程?

通俗的说,协程就是一段段协作方式执行的程序,协作来完成一件事,协作就是协同作业。我们知道团队协同来做事,比个人单独来做事,效率肯定要高,因为团队协同可以发挥各成员的能动性、优势互补。这是拿人来比喻。我们拿做事来比喻举个例子:比如我们做饭,比如有以下环节洗菜、切菜、烧水、炒菜、煮米饭,人作为主体来操作,那么如果按部就班的做,先烧水,再洗菜,在切菜,再炒菜,再煮饭,那这顿饭要做很长时间比如总共 30 分钟吧,如果我们通过协同方式,先烧水,放灶火上就可以做其他洗菜、切菜的准备,再煮米饭,然后再来洗菜、切菜,再查看煮米饭,再炒菜,…,如此循环往复切换,最后水烧好,米饭也煮好了,菜也炒好了,饭也 OK 了,这样我们耗时可能只有 10-15 分钟,看到了吗,这就是生活中的 “协程”,由人来合理调度安排不同的环节,充分利用各种不同的资源和时间,来达到提高效率。协程是计算机程序,调用的则是不同的程序,处理者主要由 CPU 完成,处理对象是各种 IO 资源,处理的方式是不同的语言编写的程序。我们知道,CPU 可以调度不同的程序,让程序调用不同的 IO 资源,最初的进程是通过 CPU 频繁的切换来完成调用程序的,是操作系统按一定算法分配的时间片抢占被动方式来切换的,未考虑程序实际执行状况,这样切换程序会带来一定问题,而协程作为一种新的工作模式,可以让程序协作方式来执行,在需要使用 CPU 时,交给程序处理,遇到耗时的 IO 资源操作时会让出 CPU,交给处理其他程序,这样互相协作来执行,而不是抢占式的,就像交通规则,大家都遵守按一定规则礼让先行,不随便抢道,协同方式,程序都会执行的良好。

我们来看具体的案例:

go(function () {
echo "hello go1 n";
});
echo "hello main n";
go(function () {
echo "hello go2 n";
});

<< · Back Index ·>>

发表回复

相关推荐

《尸鬼》中的所有人物

《尸鬼》是一部群像剧作品,里面出场人物众多,在漫画和动画中还有部分人物外貌相似,容易被弄混,这里总结一下该作中的所有 ...

· 13秒前

各国牛肉等级划分(附京东生鲜10款高端牛排推荐)

前面介绍了牛排入门和进阶篇,今天说一下京东生鲜里的高端牛排。内容有些多,可以直接拉到底部看高端牛排推荐。我们把范围限 ...

· 4分钟前

如何煮出完美的绿豆汤?

夏至一过,盛夏的气氛就愈发浓烈了,燥热的三伏天也即将来临。此时,来一碗清凉的绿豆汤最适合不过。本期,厨房问答将从4个 ...

· 7分钟前

小白也可以日入800(内附资源,免费送)

作者:帅气大叔 公众号:大叔聊副业 说起拉新,想必大家都不陌生,大街小巷随处可见的扫码免费送就是最普通的地推,大叔以 ...

· 7分钟前

程序员自由职业接单,那些平台比较靠谱?

最近在某论坛发了一个帖子“逃离一线城市成为自由职业之后,我过得怎么样?”,没想到有这么多小伙伴来加我,还是比较意外的, ...

· 9分钟前