nginx,php-fpm

一,Nginx是异步非阻塞多进程,io多路复用

在这里插入图片描述
1、master进程:管理进程
master进程主要用来管理worker进程,具体包括如下4个主要功能: (1)接收来自外界的信号。 (2)向各worker进程发送信号。 (3)监控woker进程的运行状态。 (4)当woker进程退出后(异常情况下),会自动重新启动新的woker进程。
2、worker进程:处理请求
而基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致,这里面的原因与nginx的进程模型以及事件处理模型是分不开的。
worker进程之间是平等的,每个进程,处理请求的机会也是一样的。当我们提供80端口的http服务时,一个连接请求过来,每个进程都有可能处理这个连接,怎么做到的呢?
Nginx采用异步非阻塞的方式来处理网络事件,类似于Libevent,具体过程如下:
1)接收请求:首先,每个worker进程都是从master进程fork过来,在master进程建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程。所有worker进程的listenfd会在新连接到来时变得可读,每个work进程都可以去accept这个socket(listenfd)。当一个client连接到来时,所有accept的work进程都会受到通知,但只有一个进程可以accept成功,其它的则会accept失败。
2)处理请求:当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了
我们可以看到,一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。worker进程之间是平等的,每个进程,处理请求的机会也是一样的。

虽然nginx采用多worker的方式来处理请求,每个worker里面只有一个主线程,那能够处理的并发数很有限啊,多少个worker就能处理多少个并发,何来高并发呢?非也,这就是nginx的高明之处,nginx采用了异步非阻塞的方式来处理请求,也就是说,nginx是可以同时处理成千上万个请求的。一个worker进程可以同时处理的请求数只受限于内存大小,Worker 进程 不再同步阻塞的去处理一个请求,而是可以同时处理多个请求,无需 I/O 等待。请求r1-1,r1-2,r1-2都再在woker1进程中,如果r1-1发生阻塞需要等待,worker1就会去处理r1-2,等到r1-1处理好了由事件通知再将结果返回。

二,php-fpm是阻塞式单线程模型

在这里插入图片描述

  1. 客户端发送的请求到达nginx后nginx会解析后转发给php-fpm进程管理器
  2. php-fpm在master进程中创建多个work进程,调用一个work进程处理php代码。有请求到达work后阻塞在fcgi_accept_request()上,各自accept请求然后处理,这期间是不会接收其他请求的,也就是说work进程同时只能响应一个请求,只有把这个请求处理完了才会处理下一个。
  3. 如果所有的work都处于忙碌状态(阻塞),那么这些请求就会阻塞在master进程上。
  4. 所有work均是抢占模式来处理请求。
  5. 抢占模式:每个进程都可以得到一定CPU时间片的时间处理,时间片结束或是进程发生阻塞(数据库连接、网络请求I/O(如发送短信、邮件第三方接口)、读写文件、sleep等待)就会触发上下文切换,CPU会经由调度程序去处理下一个进程的内容。等待阻塞结束再将进程由阻塞态加入就绪态队列(此时的进程处于就绪队列高等级),等待cpu调度执行。
  6. php从代码级别的执行上是单线程的, 但是由php-fpm进程管理机制是多进程单线程的, 也就是php是多进程执行的. 有效提高并发的响应效率。
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/506089.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PDN分析及应用系列二-简单5V电源分配-Altium Designer仿真分析-AD

PDN分析及应用系列二 —— 案例1:简单5V电源分配 预模拟DC网络识别 当最初为PCB设计打开PDN分析仪时,它将尝试根据公共电源网络命名法从设计中识别所有直流电源网络。 正确的DC网络识别对于获得最准确的模拟结果非常重要。 在示例项目中已经识别出主DC网络以简化该过程。 …

【C语言】熟悉文件基础知识

欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 文件 为了数据持久化保存,使用文件,否则数据存储在内存中,程序退出,内存回收,数据就会丢失。 程序设计中&…

Visual Studio C++项目远程断点调试客户现场程序方法

前言 程序开发一个很常见的场景,就是程序在自己本地部署调试明明一点问题都没有,但是部署到客户现场就问题百出,要调试起来还很困难,在自己本地也没有条件复现,很多时候只能靠日志一点点排查和猜测,耗费大…

switch开关语句

定义 单条件多分支的开关语句。 格式定义 switch(表达式) { case 常量值1: 若干个语句 break; ... case 常量值n: 若干个语句 break; default: 若干语句 } ★注意★: ① 表达式的值必须与int兼容类型: byte,short,int&#xff…

数据分析-Pandas数据的探查面积图

数据分析-Pandas数据的探查面积图 数据分析和处理中,难免会遇到各种数据,那么数据呈现怎样的规律呢?不管金融数据,风控数据,营销数据等等,莫不如此。如何通过图示展示数据的规律? 数据表&…

LeetCode102.二叉树的层序遍历

题目 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]]输入:root [1] 输出&am…

文献阅读笔记《Spatial-temporal Forecasting for Regions without Observations》13页

目录 目录 目录 发行刊物 ABSTRACT 1 INTRODUCTION 2 RELATED WORK(相关工作 2.1 Spatial-temporal Forecasting(时空预测 2.2 Spatial-temporal Forecasting withIncomplete Data(不完全数据的时空预测 2.3 Graph Contrastive Lear…

【数据分享】2001~2023年中国区域MOD17A3HGF GPP数据

各位同学们好&#xff0c;今天和大伙儿分享的是2001~2023年中国区域MOD17A3HGF GPP数据。如果大家有下载处理数据等方面的问题&#xff0c;您可以私信或评论。 Running, S., M. Zhao. <i>MODIS/Terra Net Primary Production Gap-Filled Yearly L4 Global 500m SIN Grid…

面试复盘——14

前言 无锡的一家企业&#xff0c;但是看Boss上面给的薪资不高还是要求硕士…面试体验很棒&#xff0c;hr、技术、三个人一起的。 一面 问技术栈&#xff0c;接触了Go多久&#xff0c;先前是用什么的。 Golang的切片、特点。 切片赋值的时候如果使用&#xff0c;是什么拷贝…

.NET高级面试指南专题十三【 单例模式介绍,用单例模式写个缓存器】

单例模式是一种常用的设计模式&#xff0c;其主要目的是确保一个类只有一个实例&#xff0c;并提供一个全局访问点。这在某些情况下很有用&#xff0c;特别是当系统中只应该存在一个实例时&#xff0c;如数据库连接、日志记录器、线程池等。 在C#中&#xff0c;实现单例模式有多…

第三百七十七回

文章目录 1. 概念介绍2. 实现方法2.1 maskFilter2.2 shader 3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"两种阴影效果"相关的内容&#xff0c;本章回中将介绍如何绘制阴影效果.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概…

索引使用规则6——单列索引联合索引

1、单列索引 单列索引&#xff1a;即一个索引只包含单个列 举个例子 1.1、给phone和那么建立索引 create index index_name on tb_qianzhui(name); create index index_phone on tb_qianzhui(phone);1.2、查询发现可能的索引有好几个&#xff0c;但是最终选择了phone的索引…