前言
本文主要讲述
PHP是如何接收并处理请求
同时可以了解
一个请求的大致生命周期。
Apache 与 Nginx 作为 WebServer 的区别。
CGI 和 FastCGI 是什么以及作用。
php-fpm是什么以及作用。
核心问题
- PHP是怎么接收到并处理请求的?
请求的大致生命周期
- 浏览器发起请求
- WebServer(Ngin / Apache)分发请求 给 php
- php接收请求并处理,返回处理结果 给 WebServer
- WebServer(Nginx / Apache)接收并返回结果 给 浏览器
- 浏览器得到请求结果
通过生命周期,我们可以了解到,浏览器跟我们写的php程序是通过WebServer(Nginx / Apache)作为中间件交互的。
Apache 和 Nginx 都可以作为 WebServer,但是随着现在流量越来越大,对并发的要求也在提高,Nginx便成为了目前主流的WebServer中间件。
Nginx
在nginx中可拆分多个问题来理解
-
nginx是怎么接收并分发请求的?
浏览器发起请求 默认是80端口,nginx监听80端口
通过nginx 我们可以使用正侧匹配请求类型,根据不同的请求类型分发处理。请求类型分为 请求静态资源 / 请求动态资源
静态资源一般指文件(html、css、js等)、图片等;
动态资源一般指数据(需要程序处理返回的结果) -
nginx是怎么转发请求给 php-fpm?
php-fpm监听9000端口,nginx匹配到php文件,就会通过nginx的ngx_http_fastcgi_module模块把请求分发给php-fpm处理。
因为浏览器发送的是 http/https请求,php-fpm并不懂怎么处理,就需要通过nginx的ngx_http_fastcgi_module模块,映射成FastCGI请求被php-fpm处理, -
CGI 和 FastCGI 到底是什么玩意?
在了解
php-fpm之前,要先了解CGI和FastCgi;
CGI:是web服务器运行外部程序的规范,可以通过它与来跟程序通信。CGI会为每个请求创建一个进程来处理,并在处理完成后销毁请求。
FastCGI:是CGI的升级版,FastCGI会预先启动一个master进程(主进程),master进程会读取配置文件,然后fork(分流)出多个work进程(子进程/工作进程)来等待连接,监听并处理请求;而且FastCGI会管理进程,不会轻易销毁进程,减少消耗,提高了性能。 -
php-fpm是什么?有什么作用?
php-fpm是实现FastCGI的php版本,同样是预先启动一个master进程来读取php相关的配置,然后fork出若干个work进程,work进程的数量是可配置的,每个work进程都有一份php解释器,程序就是在work进程中执行程序代码的。
Apache
现在关于apache的文章比较少了,这里先简单说下我的理解,关于这部分有点底气不足了。如果有大佬看到这里,请评论给我指明道路。
配置过apache环境就知道,要能够运行php,就要在apache下配置httpd.conf文件中,配置php。
其实php就是作为apache的一个子模块来运行的,apdche运输php的方式有三中,分别是:CGI、mod_php、FastCGI。而默认是mod_php。