33

PHP运行模式:CGI,Fast-CGI,PHP-FPM,PHP-Cli

 4 years ago
source link: https://www.tuicool.com/articles/F7niYzN
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

CGI协议模式

CGI模式是指通用网关接口(Common Gateway Interface),它允许web服务器通过特定的协议与应用程序通信, 调用原理大概为:

用户请求->Web服务器接收请求->fork子进程 调用程序/执行程序->程序返回内容/程序调用结束->web服务器接收内容->返回给用户 。

由于每次用户请求,都得fork创建进程调用一次程序,然后销毁进程,所以性能较低。

Fast-CGI 协议模式

Fast-CGI是CGI模式的升级版,它像是一个常驻型的cgi,只要开启后,就可一直处理请求,不再需要结束进程, 调用原理大概为:

web服务器fast-cgi进程管理器初始化->预先fork n个进程

用户请求->web服务器接收请求->交给fast-cgi进程管理器->fast-cgi进程管理区接收,给其中一个空闲fast-cgi进程处理->

处理完成,fast-cgi进程变为空闲状态,等待下次请求->web服务器接收内容->返回给用户。

注意,Fast-CGI和CGI都是一种协议,开启的进程是单独实现该协议的进程。

PHP-FPM模式

PHP-FPM(FastCGI 进程管理器)用于替换 PHP FastCGI 的大部分附加功能,对于高负载网站是非常有用的。

它的功能包括:

  • 支持平滑停止/启动的高级进程管理功能;
  • 可以工作于不同的 uid/gid/chroot 环境下,并监听不同的端口和使用不同的 php.ini 配置文件(可取代 safe_mode 的设置);
  • stdout 和 stderr 日志记录;
  • 在发生意外情况的时候能够重新启动并缓存被破坏的 opcode;
  • 文件上传优化支持;
  • "慢日志" - 记录脚本(不仅记录文件名,还记录 PHP backtrace 信息,可以使用 ptrace或者类似工具读取和分析远程进程的运行数据)运行所导致的异常缓慢;
  • fastcgi_finish_request() - 特殊功能:用于在请求完成和刷新数据后,继续在后台执行耗时的工作(录入视频转换、统计处理等);
  • 动态/静态子进程产生;
  • 基本 SAPI 运行状态信息(类似Apache的 mod_status);
  • 基于 php.ini 的配置文件。

PHP-FPM的工作原理大概为:

php-fpm启动->生成n个fast-cgi协议处理进程->监听一个端口等待任务

用户请求->web服务器接收请求->请求转发给php-fpm->php-fpm交给一个空闲进程处理 ->进程处理完成->php-fpm返回给web服务器->web服务器接收数据->返回给用户。

PHP-Cli模式

php-cli模式属于命令行模式,对于很多刚开始学php就开始wamp,wnmp的开发者来说是最陌生的一种运行模式。

该模式不需要借助其他程序,直接在控制台输入php xx.php 就能执行php代码。

命令行模式和常规传统的web模式明显不一样的是:

  • 没有超时时间
  • 默认关闭buffer缓冲
  • STDIN和STDOUT标准输入/输出/错误 的使用
  • echo var_dump,phpinfo等输出直接输出到控制台
  • 可使用的类/函数 不同
  • php.ini配置的不同

在php-cli中,是没有超时时间的,也无法通过 set_time_limit 设置超时时间,举个栗子:

<?php
set_time_limit(30);
while (1){
    echo 1;
    sleep(1);
}

这段代码,在常规web下运行,只要到30秒就会报Fatal error: Maximum execution time of 30 seconds exceeded in ......这样的错误。

而在php-cli中,这段代码将会一直执行,一直输出1到控制台中。

php有些扩展在常规web下运行时没用/没有意义的,例如:

swoole扩展

socket扩展

模块模式

Apache+PHP运行时,默认使用的是模块模式,它把php作为apache的模块随apache启动而启动,接收到用户请求时则直接通过调用mod_php模块进行处理,详细内容可自行百度。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK