zoukankan      html  css  js  c++  java
  • PHP-FPM + Nginx 的工作机制,以及PHP脚本解释执行的机制

    1.1 PHP-FPM + Nginx 的工作机制

    请求从Web浏览器到Nginx,再到PHP处理完成,一共要经历如下五个步骤:

    第一步:启动服务

    • 启动PHP-FPM。PHP-FPM 支持两种通信模式:TCP socket和Unix socket;
    • PHP-FPM 会启动两种类型的进程:Master 进程 和 Worker 进程,前者负责监控端口、分配任务、管理Worker进程;后者就是PHP的cgi程序,负责解释编译执行PHP脚本。
    • 启动Nginx。首先会载入 ngx_http_fastcgi_module 模块,初始化FastCGI执行环境,实现FastCGI协议请求代理
    • 这里要注意:fastcgi的worker进程(cgi进程),是由PHP-FPM来管理,不是Nginx。Nginx只是代理

    第二步:Request => Nginx

    • Nginx 接收请求,并基于location配置,选择一个合适handler
    • 这里就是代理PHP的 handler

    第三步:Nginx => PHP-FPM

    • Nginx 把请求翻译成fastcgi请求
    • 通过TCP socket/Unix Socket 发送给PHP-FPM 的master进程

    第四步:PHP-FPM Master => Worker

    • PHP-FPM master 进程接收到请求
    • 分配Worker进程执行PHP脚本,如果没有空闲的Worker,返回502错误
    • Worker(php-cgi)进程执行PHP脚本,如果超时,返回504错误
    • 处理结束,返回结果

    第五步:PHP-FPM Worker => Master => Nginx

    • PHP-FPM Worker 进程返回处理结果,并关闭连接,等待下一个请求
    • PHP-FPM Master 进程通过Socket 返回处理结果
    • Nginx Handler顺序将每一个响应buffer发送给第一个filter → 第二个 → 以此类推 → 最终响应发送给客户端

    1.2 PHP脚本解释执行的机制

    了解了PHP + Nginx 整体的处理流程后,我们接下来看一下PHP脚本具体执行流程,

    首先我们看一个实例:

    <?php 
        if (!empty($_POST)) { 
            echo "Response Body POST: ", json_encode($_POST), "
    "; 
       }
        if (!empty($_GET)) {
             echo "Response Body GET: ", json_encode($_GET), "
    "; 
       }    

    我们分析一下执行过程:

    1. php初始化执行环节,启动Zend引擎,加载注册的扩展模块
    2. 初始化后读取脚本文件,Zend引擎对脚本文件进行词法分析(lex),语法分析(bison),生成语法树
    3. Zend 引擎编译语法树,生成opcode,
    4. Zend 引擎执行opcode,返回执行结果

    在PHP cli模式下,每次执行PHP脚本,四个步骤都会依次执行一遍;

    在PHP-FPM模式下,步骤1)在PHP-FPM启动时执行一次,后续的请求中不再执行;步骤2)~4)每个请求都要执行一遍;

    其实步骤2)、3)生成的语法树和opcode,同一个PHP脚本每次运行的结果都是一样的

    客户端 -> nginx -> fastCgi -> php-fpm -> nginx -> 客户端

  • 相关阅读:
    日报10.29
    日报10.28
    日报10.27
    周进度总结-6
    日报10.25
    日报10.23
    日报10.22
    日报10.21
    日报10.18
    STL bitset
  • 原文地址:https://www.cnblogs.com/dawuge/p/13037459.html
Copyright © 2011-2022 走看看