php与swoole进程模型知多少

面试中,我们经常会被问到,PHP是怎么运行的,swoole为什么比nginx和php-fpm的组合效率高等等进程模式方向的内容。平时倒是多多少少有听过sapi,php-fpm,Master/Worker,但要是真回答起来,就开始模棱两可甚至概念都会有点模糊。因此特地整理总结了一下,也为大家理清一下思路。


Apache和LoadModule模式

Apache和LoadModule模式运行PHP应该是属于比较经典的了,小马初识PHP就是用的这个模式。是否还记得我们安装完apache和PHP后在 Apache的配置文件 httpd.conf中加上这样的配置:

# 加入以下2句

LoadModule php5_module E:/php/php5apache2_2.dllAddType application/x-httpd-php .php

# 修改如下内容<IfModule dir_module>

DirectoryIndex index.php index.html</IfModule>

所以,这种方式本质是用 LoadModule 来加载 php5_module,把php作为apache的一个子模块来运行。当通过web访问php文件时,apache就会调用php5_module来解析php代码。php5_module通过sapi将数据传给php解析器来解析php代码。如图。



apache调用php执行的过程如下:apache -> httpd -> php5_module(sapi) -> php

sapi(server api)其实就是一种协议,sapi提供了一个和外部通信的接口,使得PHP可以和其他应用(apache,nginx等)进行交互数据。常见的有如PHP提供给apache和nginx的php5_module、CGI、FastCGI,提供给IIS的ISAPI(记得小马曾经在.net团队中配置过IIS跑PHP),提供给Shell的CLI等协议。

Apache也有三种工作模式


Apache进程模型


每一个请求到达,apache都会去fork一个子进程来连接php通过sapi来处理请求,直到这个请求处理完毕,且apache处理请求是同步阻塞方式。一个客户端占用一个进程,所以进程的数量决定了并发处理的能力,对高并发并不是很友好。

Nginx和php-fpm组合

Nginx和php-fpm的组合是 Master主进程/Worker多进程模式,启动一个 Master 进程通过 FastCGI 协议监听来自 Nginx 传输的请求,再fork 多个Worker进程处理请求,但每个Worker进程只对应一个请求连接,用于执行完整的PHP代码。对于CGI来说,每一个Web请求PHP都必须重新解析php.ini、重新载入全部扩展,并重新初始化全部数据结构。而使用FastCGI,所有这些都只在进程启动时发生一次。


总结一下:进程模型apache与nginx两者的主要区别在于apache是同步多进程模型,一个连接对应一个进程;而nginx是异步的,多个连接可以对应一个进程(一个Master多个Worker)。(题外话:不过apache的rewrite比Nginx的rewrite强大。)


运行模式的“进化”

所以,PHP WEB服务器目前最佳方式是Apache/Nginx + FastCGI + PHP-FPM(+PHP-CGI)不建议 Module加载或者CGI方式。

swoole进程模型

swoole是怎么做到那么优秀的呢?为什么就重新定义了PHP而使其能号称全宇宙最好的语言呢?我们看一下进程模型。

swoole也是Master主进程(由多个 Reactor 线程组成)和Worker多进程(或多线程)模式,不同的是,包含了Reactor 线程和Manager 进程的概念。

swoole进程模型

启动一个Master进程,初始化PHP代码(仅在启动时执行一次初始化),因为 swoole 需要通过cli的方式运行,所以初始化时,不会初始化 PHP 的全局变量,如 $_SERVER, $_POST, $_GET 等;执行 PHP 脚本,包括词法、语法分析,变量、函数、类的初始化等,由Reactor线程监听 Socket 句柄的事件变化(Master进入监听状态,但并不会结束进程),Reactor线程负责子多线程的均衡问题,Manager 进程管理Worker多进程,包括 TaskWorker 的进程。每一个Worker进程接收来自Reactor的请求,只需要执行回调函数部分的PHP代码。

swoole进程
swoole运行流程图

那么这个进程模式为什么能对性能加速呢?为什么能比传统的PHP运行模式高效呢?因为由Reactor线程(epoll的IO复用方式)负责监听Socket句柄的事件变化,负责子进程均衡问题,减少高并发下的资源开销。通过内存常驻的方式节省php代码初始化的时间。小马认为,其实主要还是协程的使用。

好了,整理就到这了,应该是比较清晰了。


相关资料:CGI、FastCGI和PHP-FPM关系图解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342