您现在的位置是:首页> 编程文章 个人博客模板
nginx 和 PHP-fpm 的交互
无痕小Q个人博客 2020-03-17 00:01:50【 主页】 1130人已围观
简介nginx 是一个 webservice 的功能,当检测到访问 php 文件时,会把请求交给 fastcgi 模块处理。我们可以在 nginx 的配置文件中配置 fastcgi 的相关参数
nginx 的 fastcgi 模块会把请求交给 php-fpm 程序处理。php-fpm 的 worker 进程处理完后,会把数据返回给 nginx,nginx 会把数据放到内存缓存中,缓存区大小为 fastcgi_buffer_size,fastcgi_buffers 控制。如果返回数据大于缓存,则多出来的数据会被临时写入到文件中,放在 fastcgi_temp 目录下面。
#### PHP-FPM
php-fpm 是一种 master(主)/worker(子)多进程架构
master 的工作分为四步:
1.cgi 初始化阶段:分别调用 fcgi_init () 和 sapi_startup () 函数,注册进程信号以及初始化 sapi_globals 全局变量。
2.php 环境初始化阶段:a). 加载和解析 php 配置;b). 加载 php 模块并记入函数符号表 (function_table);c). 加载 zend 扩展;d). 设置禁用函数和类库配置;e). 注册回收内存方法;
3.php-fpm 初始化阶段:执行 fpm_init () 函数。负责解析 php-fpm.conf 文件配置,获取进程相关参数(允许进程打开的最大文件数等), 初始化进程池及事件模型等操作。
4.php-fpm 运行阶段:执行 fpm_run () 函数,运行后主进程发生阻塞。该阶段分为两部分:fork 子进程 和 循环事件。fork 子进程部分交由 fpm_children_create_initial 函数处理( 注:ondemand 模式在 fpm_pctl_on_socket_accept 函数创建)。循环事件部分通过 fpm_event_loop 函数处理,其内部是一个死循环,负责事件的收集工作。
worker 进程分三步:
1. 接收客户端请求:执行 fcgi_accept_request 函数,其内部通过调用 accept 函数获取客户端请求。
2. 处理请求阶段:首先,分别调用 fpm_request_info、php_request_startup 获取请求内容及注册全局变量 ($_GET、$_POST、$_SERVER、$_ENV、$_FILES);然后根据请求信息调用 php_fopen_primary_script 访问脚本文件;最后交给 php_execute_script 执行。php_execute_script 内部调用 zend_execute_scripts 方法将脚本交给 zend 引擎处理。
3. 请求结束阶段:执行 php_request_shutdown 函数。此时 回调 register_shutdown_function 注册的函数及__destruct () 方法,发送响应内容、释放内存等操作。
常见错误码
502:请求的 PHP-CGI 已经执行,但是由于某种原因(一般是读取资源的问题)没有执行完毕而导致 PHP-CGI 进程终止,比如 php-fpm 的 worker 进程的最大执行时间超过了,或者其他原因提前终止了。Nginx 会发现与自己通信的连接断掉了,就会返回给客户端 502 错误。
504:简单来说就是没有请求到可以执行的 PHP-CGI(php-fpm 没有开启或者 worker 数量不足),或者 nginx 的 Fastcgi 的参数 fastcgi_connect_timeout 超时,就是说 php-fpm 的执行时间超过了 nginx 的 fastcgi 连接时间限制。
阅读量! (1130)
点击排行
网站公告
- 欢迎来到我的博客
1:欢迎来到我的博客
2:博客免费api接口现已上线
3:博客会定期更新文章
4:欢迎大家来捧场
站点信息
- 建站时间:2019-8-30
- 网站程序:php,laravel-swoole框架
- 今日流量:612(10分钟统计一次)
- 本月流量:9331
- 浏览总量:388258
- 统计方式:中间件,redis消息队列,定时任务