对于php-fpm和cgi,还有并发响应的理解

参考链接:

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

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

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

https://www.cnblogs.com/scott19820130/p/4915515.html   PHP 线程,进程和并发

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

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

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

首先搞清楚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 模式

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

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

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

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

  

时间: 2024-10-09 04:35:50

对于php-fpm和cgi,还有并发响应的理解的相关文章

HTTP 并发响应模型

httpd: MPM 并发响应模型 prefork(select 1024个并发), worker, event 1.穿行响应模型 2.多进程模型,主控进程负责接收链接(监听端口),主控进程fork一个子进程进行通信,子进程占用一个句柄.启动的子进程数量有限,fork的进程需要预先提供好,所以叫prefork. 3.worker模型,线程模型响应,主控进程fork一个子进程(可以由多个自己进程),子进程内部有多个线程去响应链接. 4.event,事件驱动模型, I/O模型 1.同步 synchr

对JAVA多线程 并发编程的理解

对JAVA多线程并发编程的理解 Java多线程编程关注的焦点主要是对单一资源的并发访问,本文从Java如何实现支持并发访问的角度,浅析对并发编程的理解,也算是对前段时间所学的一个总结. 线程状态转换 Java语言定义了5中线程状态,在任何一个时间点,一个线程只能有且只有其中一种状态,这5中状态分别是: ?  新建(New):创建后尚未启动的线程处于这种状态 ?  运行(Runable):Runable包括了操作系统线程状态中的Running和Ready,也就是处于此状态的线程可能正在执行,也有可

并发用户数的理解

什么是并发用户数,很多人都会拿这个指标来衡量一个网络系统的好与坏,刚开始接触Loadrunner的时候,曾认为虚拟用户就是所谓的并发用户数,不过经过一系列的测试后,发现这种看法并不怎么全是正确.首先,要分两种测试情况,第一种是通过跑网页实际业务测试,如教务系统,观察其登陆事务,查询事务等,第二种,测试跑单个静态页面,或者动态页面,服务器所表现出来的性能.        第一种,可以设计集中点,让虚拟用户同时登陆,观察其响应事务情况,那么这个观察点,可以说是,同一时刻,并发登陆的用户数是你的虚拟用

java并发编程--深入理解volatile关键字

??volatile是一个在java并发编程中耳熟能详的关键字.即使从来没有使用过,你也偶尔会在技术书籍或博客中见到.对volatile关键字的解释常常被一笔带过:被修饰的变量具有可见性,但不能保证原子性.但是到底如何保证可见性,可见性是什么--诸如此类的问题在碰到这种凝练的解释时会产生一种知其然不知其所以然的困惑.那么我将尽力在这一篇文章中将volatile关键字的意义彻底击穿. 可见性 ??可见性,顾名思义,可见程度.假如你在被窝里打开了手电筒,只有你自己知道手电筒打开了,那么可见性就非常差

Java 并发:深入理解 ThreadLocal

摘要: ThreadLocal 又名线程局部变量,是 Java 中一种较为特殊的线程绑定机制,用于保证变量在不同线程间的隔离性,以方便每个线程处理自己的状态.进一步地,本文以ThreadLocal类的源码为切入点,深入分析了ThreadLocal类的作用原理,并给出应用场景和一般使用步骤. 一. 对 ThreadLocal 的理解 1). ThreadLocal 概述 ThreadLocal 又名 线程局部变量,是 Java 中一种较为特殊的 线程绑定机制,可以为每一个使用该变量的线程都提供一个

网站并发数的理解

想要探讨这个概念,源于某个攻击事件.某个应用平台遭到外部攻击,导致apache连接数冲高,平台使用缓慢.通过日志分析平台来看,从平台遭遇攻击起,apache请求数在不断下降,与之前的认知有所不同. 之前认为apache请求数在遭遇攻击时,应该不断增加才是.实则这个请求数可以理解为并发数,就引出"网站并发数"的概念. 对于网站服务器而言,网站并发数,可以理解为,在单位时间内,服务器能够同时处理的最大请求数.由于请求业务的不同,有的请求1秒内结束,有的请求10秒内结束.因此,网站并发并不是

关于url请求和json数据的响应的理解和接口的压力测试

原来,请求只是个地址,一般用GET获取,并没有发送json包过去, 是服务器返回json包回来,然后开发接收之后,把json包解析, ("请求了一个json包"这句话真的让我误会了好久), 实际上BS或者CS架构的东西,就是一个来回,request和response, 一般来说,接口(包含参数+地址等)就是一个request, 而正确的request之后,服务器会返回一堆数据包,这个过程叫response, 数据包一般都是json包,把json包解析加上前端各种标签的排列, 就可以看到

[Storm] 并发度的理解

Tasks & executors relation Q1. However I'm a bit confused by the concept of "task". Is a task an running instance of the component(spout or bolt) ? An executor having multiple tasks actually is saying the same component is executed for multi

关于Storm 中Topology的并发度的理解

来自:http://blog.csdn.net/derekjiang/article/details/9040243 概念理解 原文中用了一张图来说明在一个storm cluster中,topology运行时的并发机制. 其实说白了,当一个topology在storm cluster中运行时,它的并发主要跟3个逻辑实体想过:worker,executor 和task 1. Worker 是运行在工作节点上面,被Supervisor守护进程创建的用来干活的进程.每个Worker对应于一个给定top