PHP是如何接收并处理请求的(Nginx,Apache)

410 阅读3分钟

前言

本文主要讲述
PHP是如何接收并处理请求

同时可以了解
一个请求的大致生命周期。
Apache 与 Nginx 作为 WebServer 的区别。
CGI 和 FastCGI 是什么以及作用。
php-fpm是什么以及作用。

核心问题

  • PHP是怎么接收到并处理请求的?

请求的大致生命周期

  1. 浏览器发起请求
  2. WebServer(Ngin / Apache)分发请求 给 php
  3. php接收请求并处理,返回处理结果 给 WebServer
  4. WebServer(Nginx / Apache)接收并返回结果 给 浏览器
  5. 浏览器得到请求结果

通过生命周期,我们可以了解到,浏览器跟我们写的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文件,就会通过nginxngx_http_fastcgi_module模块把请求分发给php-fpm处理。
    因为浏览器发送的是 http/https请求,php-fpm并不懂怎么处理,就需要通过nginxngx_http_fastcgi_module模块,映射成 FastCGI 请求被 php-fpm处理,

  • CGI 和 FastCGI 到底是什么玩意?

    在了解php-fpm之前,要先了解CGIFastCgi
    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。