对于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进程来处理,这就是多进程同步阻塞模式的弊端,当然还有进程过多所带来的内存占用问题。
对于php-fpm和cgi,还有并发响应的理解的更多相关文章
- php-fpm和cgi,并发响应的理解以及高并发和多线程的关系
首先搞清楚php-fpm与cgi的关系 cgi cgi是一个web server与cgi程序(这里可以理解为是php解释器)之间进行数据传输的协议,保证了传递的是标准数据. php-cgi php-c ...
- 提高Web服务器并发响应的经历
1 前言 ---------- 最近一直在维护一个线上运行的旧系统,系统本身的问题很多,然而又有大量客户准备试用.之前一直存有侥幸心理,希望系统能神奇的顶过这段时间,但这个蜗牛般的系统残忍的告诉我们- ...
- [Storm] 并发度的理解
Tasks & executors relation Q1. However I'm a bit confused by the concept of "task". Is ...
- JAVA中关于并发的一些理解
一,JAVA线程是如何实现的? 同步,涉及到多线程操作,那在JAVA中线程是如何实现的呢? 操作系统中讲到,线程的实现(线程模型)主要有三种方式: ①使用内核线程实现 ②使用用户线程实现 ③使用用户线 ...
- Storm中并发程度的理解
Storm中涉及到了很多组件,例如nimbus,supervisor等等,在参考了这两篇文章之后,对这个有了更好的理解. Understanding the parallelism of a Stor ...
- iOS 之GCD串行和并发队列的理解
dispatch_queue_t serialQueue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_SERIAL) ...
- 关于Storm 中Topology的并发度的理解
来自:https://storm.apache.org/documentation/Understanding-the-parallelism-of-a-Storm-topology.html htt ...
- Java并发编程原理与实战二:并行&并发&多线程的理解
1.CPU的发展趋势: 核心数目依旧会越来越多,根据摩尔定律,由于单个核心性能提升有着严重的瓶颈问题,普通的PC桌面在2018年可能回到24核心. 2.并发和并行的区别: 所有的并发处理都有排队等候, ...
- Java高并发syncronized深入理解
1.Synchronized的作用: 能够保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全的效果. 2.地位: 1)Synchronized是java的关键字,并java的怨言原生支持: ...
随机推荐
- dos攻击命令
net user //查看有哪些用户 net start //查看开启了哪些服务项目 net send ip "文本信息" //向对方发送消息(如果对方关了信使有可能会收不到) n ...
- zoj3710 friends(floyd变形)
Friends Time Limit: 2 Seconds Memory Limit: 65536 KB Alice lives in the country where people li ...
- python - 常用模块栗子
前言 内容摘自Python参考手册(第4版) 及 自己测试后得出.仅作为一个简单记录,方便使用查询之用. 另 dir(func)及func.__doc__可以查看对象属性及说明文档. 序列Seque ...
- 改变oracle数据库归档模式_译文
Changing the Database Archiving Mode 改变数据库归档模式. Purpose 目的 This module describes how you can change ...
- TableView的性能优化
现在市场上的iOS应用程序界面中使用最多的UI控件是什么? 答案肯定是UITableView,几乎每一款App都有很多的界面是由UITableView实现的,所以为了做出一款优秀的App,让用户有更好 ...
- MyBatis开发中解决返回字段不全的问题
场景重现: mybatis 在查询的时候,可以返回Map,但是一旦这个字段为空(null)的时候,map里就没有了.我用的是mysql数据库,除了在查询语句上做ifnull判断给它默认值外,有没的别的 ...
- 容器中使用iptables报错can't initialize iptables table Permission denied (you must be root)
背景 在docker容器中部署了一微服务,该服务需要docker push镜像到docker registry.因此,docker容器中需要安装docker服务.但在启动容器的时候,却报错: can' ...
- Appium python自动化测试系列之Android UIAutomator终极定位(七)
android uiautomator text定位 可能有人不知道为什么说android uiautomator是终极定位,而且android uiautomator和appium有什么关系呢?如果 ...
- Android基础知识笔记01—框架结构与四大组件
-----------Andriod 01--------------->>> Andriod系统架构 linux内核与驱动层. 系统运行库层. 应用框架层. 应用层 内核驱动 ...
- Java正则表达式详解+练习
一.导读 正则表达式,又称规则表达式.(英文名Regular Expression,所以代码中常以regex.regexp.RE表示).正则表达式简单说就是用于操作文本数据的规则表达式,在Java中我 ...