0%

php-fpm三种运行方式

之前已经说过cgi、fast-cgi、php-cgi、php-fpm这几个词的关系了,今天咱们来看看php-fpm三种运行方式!

一、基础

  1. PHP-FPM(FastCGI Process Manager)是一个PHPFastCGI进程管理器,从其英文名称和定义可以看出,FPM的核心功能就是进程管理。
  2. FastCGI可以理解为一种协议,用于web服务器(nginx、Apache)和处理程序间进行通信,是一种应用层通信协议。

二、过程

  1. fpm的实现就是创建一个master进程,在master进程中创建worker pool并监听socket,然后fork出多个子进程(worker)。worker进程启动后阻塞在fcgi_accept_request()上接收请求,有请求到达后worker开始读取请求数据,读取完成后开始处理然后再返回,在这期间是不会接收其它请求的。这也就是说fpm的子进程同时只能响应一个请求,只有把这个请求处理完成后才会接收下一个请求。

    • fpm的master进程与worker进程之间不会直接进行通信,master通过共享内存获取worker进程的信息,比如worker进程当前状态、已处理请求数等,当master进程要杀掉一个worker进程时则通过发送信号的方式通知worker进程
  2. worker的工作流程包含以下几个步骤

    • 等待请求:fcgi_accept_request()阻塞等待请求
    • 接收请求:fastcgi请求到达后被worker接收并解析,一直到完全接收,然后将method、query、uri等信息保存到worker进程的fpm_scoreboard_proc_s结构中
    • 初始化请求:php_request_startup()执行,此步骤会调用每个扩展的PHP_RINIT_FUNCTION方法,初始化一些操作
    • 处理请求(编译、执行):php代码编译执行阶段,由 php_execute_script方法完成
    • 关闭请求:返回响应,执行php_request_shutdown方法关闭请求,然后进入第一步继续等待请求,此步骤会执行每个扩展的PHP_RSHUTDOWN_FUNCTION进行一些收尾工作

三、运行方式

  1. pm = static,静态,始终保持一个固定数量的子进程,这个数由pm.max_children定义,这种方式很不灵活,也通常不是默认的。

  2. pm = dynamic,动态,子进程的数量是动态变化的,启动时会生成固定数量的子进程,可以理解成最小子进程数,通过pm.start_servers控制,而最大子进程数则由pm.max_children控制,子进程数会在pm.start_servers~pm.max_children范围内波动。另外闲置的子进程数还可以由pm.min_spare_serverspm.max_spare_servers两个配置参数控制,如果闲置的子进程超过pm.max_spare_servers则会被杀掉。

  3. pm = ondemand,按需要,这种模式和dynamic模式相反,把内存放在第一位。每个闲置进程在持续闲置了pm.process_idle_timeout秒后就会被杀掉。有了这个模式,到了服务器低峰期,内存自然会降下来,如果服务器长时间没有请求,就只有一个主进程,当然其弊端是,遇到高峰期或者pm.process_idle_timeout设置太小,无法避免服务器频繁创建进程的问题。