zoukankan      html  css  js  c++  java
  • 深入理解-CLI与PHP-FPM

    原文地址:https://blog.csdn.net/lzx_victory/article/details/85917161

    PHP-FPM模式相对于CLI比较复杂,因为PHP-FPM为常驻进程不断处理请求,因此二者只是在执行流程略有不同.

    PHP-FPM
    现在PHP广泛被使用的一种模式,用于解析FastCGI协议,执行相应的请求.

    PHP-FPM 三种模式
    static
    FPM启动根据pm.max_children固定的woker进程数.

    dynamic
    FPM是启动的woker进程是变化:根据参数pm.start_servers~pm.max_children之间的.
    pm.min_spare_servers~pm.min_spare_servers指明可空闲进程的个数,空闲进程数超过pm.min_spare_servers就会被kill掉.

    ondemand
    启动时不分配Woker进程,根据pm.process_idle_timeout空闲时间后会把进程kil掉.也受到pm.max_children的限制.

    其余参数设置

    pm.max_requests = 1000
    #设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用. 如果设置为 '0' 则一直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0.
    pm.status_path = /status
    #FPM状态页面的网址. 如果没有设置, 则无法访问状态页面. 默认值: none. munin监控会使用到
    
    rlimit_files = 1024
    #设置文件打开描述符的rlimit限制. 默认值: 系统定义值默认可打开句柄是1024,可使用 ulimit -n查看,ulimit -n 2048修改。

    Frok流程
    当PHP-FPM启动后calling process会fork master进程,然后Fork worker.

    Worker: 实际处理请求的进程.
    Master: 管理worker进程,对worker进程重启,关闭等操作.


    Master进程
    Master通过监听"外部信号"与Woker进程的信号(SIGHLD:Woker进程发送信号,Master进程处理善后工作,然后在按照模式启动),对相应的信号来管理Worker进程.
    信号机制:Master采用了socketpair一端写入信号事件,另一端在注册到事件机制中,在Master Loop读取事件,调用回调函数(fpm_got_signal)执行对应的信号.
    FPM内部对事件进行了封装,用于支持不同的事件模型,例如epoll,select,kqueue等.
    Master进程还有重要的作用统计所有Worker进程的信息,用于统计的数据结构叫做计分板.

    Woker进程
    Woker进程,特殊处理的信号只有SIGQUIT,其余的都是执行默认信号处理(SIG_DFL).
    当收到SIGQUIT时,in_shutdown静态全局变量置为1,确保在fcgi_accept_request方法返回-1,不在accept新的请求并结束相应的Woker进程.
    每个Woker进程存在于一个进程池内,根据FPM可以配置多个进程池.
    每个Worker进程进行accept时会阻塞并接收一个请求.每个Woker进程执行accept函数在Linux2.6内核版本不会形成惊群效应.

    FCGI协议
    FCGI是一种交互式协议,基于CGI协议的一种变体.在每次请求到达是不需要新建进程,减少了进程创建以及销毁的资源损耗.
    每次FastCGI请求成为Record由以下结构组成:

    BeginRequestRecord:包含请求的信息,请求ID,以及请求的角色等.
    EndRequestBody:请求结束的标识,包含最终Appliancation返回处理状态.
    Header:被包含EndRequestBody,BeginRequestRecord,以及以及类型当中.每个数据段需要由Header指定这个段的类型,RequestID以及长度…

    /*
     * Values for type component of FCGI_Header
     */
    #define FCGI_BEGIN_REQUEST       1
    #define FCGI_ABORT_REQUEST       2
    #define FCGI_END_REQUEST         3
    #define FCGI_PARAMS              4//key value 类型.
    #define FCGI_STDIN               5
    #define FCGI_STDOUT              6
    #define FCGI_STDERR              7
    #define FCGI_DATA                8
    #define FCGI_GET_VALUES          9
    #define FCGI_GET_VALUES_RESULT  10
    #define FCGI_UNKNOWN_TYPE       11
    #define FCGI_MAXTYPE (FCGI_UNKNOWN_TYPE)
    typedef struct {
        unsigned char version;
        unsigned char type;
        unsigned char requestIdB1;
        unsigned char requestIdB0;
        unsigned char contentLengthB1;
        unsigned char contentLengthB0;
        unsigned char paddingLength;
        unsigned char reserved;
    } FCGI_Header;

    FCGI协议详述,这里有详细的介绍以及示例.

    CLI 与 PHP-FPM执行流程

    PHP-FPM

    CLI

    CLI也是最常用的一种模式,我们来看下他执行的过程.


    1.php_module_start_up:将sapi_globals中的成员变量进行初始化.
    2.php_request_start_up:将zend引擎的编译器,扫描器,编译器等进行初始化.
    3.php_excute_script:读取代码并扫描词法和语法生成AST,初始化op_array并将AST编译生成opcode,设置op_array对应的handler,然后执行opcode.
    4.php_request_shutdown:调用各模块的析构函数,输出缓冲区调用扩展的RSHUTDOWN函数.销毁全局变量,关闭解析器.
    5.php_module_shutdown:在php_module_startup初始化的内容要进行销毁.

  • 相关阅读:
    前端三剑客之css 后续
    前端三剑客之css
    优酷项目遇到的知识点回顾
    MySQL 里 视图,触发器,事物,存储过程,内置函数,流程控制,索引
    mysql的用户管理
    数据库管理工具 navicat 相关的练习
    MySQL 单表查询,多表查询
    MySQL 外键 表与表的关系 多对一,多对多,一对一,表的修改 与 复制
    ORM基础
    Django路由系统
  • 原文地址:https://www.cnblogs.com/phpk/p/10930558.html
Copyright © 2011-2022 走看看