资讯专栏INFORMATION COLUMN

对PHP-FPM和CGI,还有并发响应的理解

tianyu / 3390人阅读

摘要:官方对的解释是进程管理器。对并发访问的处理进程和线程从代码级别来讲不支持多线程操作,不能像等语言一样可以编写多线程代码。

关于本篇文章的部分纠正,请参考这篇文章:http://www.cppblog.com/woaido...

首先搞清楚php-fpm与cgi的关系 CGI

CGI是一个web server与cgi程序(这里可以理解为是php解释器)之间进行数据传输的协议,保证了传递的是标准数据。

PHP-CGI

php-cgi是php解释器,就是上文提到的cgi程序。

Fastcgi

Fastcgi是用来提高cgi程序(php-cgi)性能的方案/协议。

cgi程序的性能问题在哪呢?"PHP解析器会解析php.ini文件,初始化执行环境",就是这里了。标准的CGI对每个请求都会执行这些步骤,所以处理的时间会比较长。

Fastcgi会先启一个master进程,解析配置文件,初始化执行环境,然后再启动多个worker进程。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复劳动,效率自然提高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是Fastcgi的对进程的管理。

PHP-FPM

  上文提到了Fastcgi只是一个方案或者协议,那么php-fpm就是这个实现了Fastcgi的程序,也就是说,上文所描述的进程分配和管理是FPM来做的。官方对FPM的解释是 Fastcgi Process Manager(Fastcgi 进程管理器)。

PHP对并发访问的处理 进程和线程

PHP从代码级别来讲不支持多线程操作,不能像Java、C#等语言一样可以编写多线程代码。但多线程和并发没有直接关系,多线程只是代码被运行时在同一时间同时执行多个线程任务,来提高服务器CPU的利用率,提高代码效率。但php是可以多进程执行的,上文所述的FPM进程管理机制就是多进程单线程的,有效提高了并发访问的响应效率。

简单的web server + php-fpm 模式

当客户端发送一个请求时,web server会通过一个php-fpm进程(这里和下文所说指的fpm进程都是fpm开启的worker进程,关于fpm的工作原理这里不再累述)去执行php代码,php代码的执行是单线程的。

那么,当有多个客户端同时发送请求时(并发),web server会通过php-fpm为每个请求开启一个多带带进程去执行php代码。

请求执行过后,空闲的php-fpm进程被销毁,内存得以释放。

但并发的问题在于,在某一时间,客户端请求让php-fpm进程数量达到了最大限制数,这个时候,新来的请求只能等待空闲的php-fpm进程来处理,这就是多进程同步阻塞模式的弊端,当然还有进程过多所带来的内存占用问题等。


参考链接:

https://www.zhihu.com/questio... php fpm 进程数和并发数是什么关系?

https://segmentfault.com/q/10... php不支持多线程所以不用考虑并发问题?

http://bbs.csdn.net/topics/39... PHP是单线程的,如何应对大量的http访问? #9层回答

https://www.cnblogs.com/scott... PHP 线程,进程和并发

https://segmentfault.com/q/10... 搞不清FastCgi与PHP-fpm之间是个什么样的关系

http://php.net/manual/zh/inst... FastCGI 进程管理器(FPM)

https://www.cnblogs.com/Perki... 多线程(一)高并发和多线程的关系

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26101.html

相关文章

  • LNMP运维追踪技巧总结

    摘要:的运维追踪技巧总结曾几何时我开始运维公司的网站,经过一段时间的摸爬滚打,也算是总结了不少在服务器下调试追踪各种网站错误的方法。 LNMP的运维追踪技巧总结 曾几何时我开始运维公司的LNMP网站,经过一段时间的摸爬滚打,也算是总结了不少在LNMP服务器下调试追踪各种网站错误的方法。好记性不如烂笔头,还是总结一下吧! 在开始我会梳理一下我所理解的一个web请求从发起到响应的各个阶段服务器和...

    XboxYan 评论0 收藏0
  • LNMP运维追踪技巧总结

    摘要:的运维追踪技巧总结曾几何时我开始运维公司的网站,经过一段时间的摸爬滚打,也算是总结了不少在服务器下调试追踪各种网站错误的方法。 LNMP的运维追踪技巧总结 曾几何时我开始运维公司的LNMP网站,经过一段时间的摸爬滚打,也算是总结了不少在LNMP服务器下调试追踪各种网站错误的方法。好记性不如烂笔头,还是总结一下吧! 在开始我会梳理一下我所理解的一个web请求从发起到响应的各个阶段服务器和...

    Cristalven 评论0 收藏0
  • 深入剖析 Web 服务器与 PHP 应用之间通信机制 - 掌握 CGI FastCGI 协议

    摘要:深入协议从功能上来讲,协议已经完全能够解决服务器与应用之间的数据通信问题。消息头信息主要的消息头信息如下用于表示协议版本号。从服务器发送到应用,表示中止一个处理中的请求。另外我们还需要明确一点就是服务器与进程间通信是无序的。 本文首发于 深入剖析 Web 服务器与 PHP 应用之间的通信机制 - 掌握 CGI 和 FastCGI 协议的运行原理,转载请注明出处! 身为一名使用 PHP ...

    mumumu 评论0 收藏0
  • HTTP、PHP-FPM、与握手协议

    摘要:一般产生的原因是系统没有主动关闭连接如连接资源没有关闭关于网络链路中追踪异常用到的运维命令以下显示的和端口均为假数据中查看的状态参数说明已使用的所有协议套接字总量正在使用正在侦听的套接字数量。其值等于已分配已建立已申请到的套接字数量。 HTTP请求的流程梳理 用户输入url如http:www.baidu.com到浏览器,浏览器如chrom需要将其解析为ip地址才知道需要到哪里去访问...

    gself 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<