zoukankan      html  css  js  c++  java
  • 《PHP

    先说下我最近看到的一篇文章,哈哈哈,特别好玩。

    一步步教你编写不可维护的 PHP 代码

    之前一直知道 PHP 在 CGI 模式下运行。命令行下在 CLI 模式下运行。

    但是 FPM 和 nginx 配置 FastCGI 他们具体是什么关系?还真的不太明白,今天来说下他们的关系。

    CGI 是干什么的?

      这得和我们的一个请求的正常流程来看。

      当一个请求来时,由 WebServer(nginx/Apache) 来对请求进行分发。

      如果请求的是 index.html 那么服务器回去寻找对应的文件并返回该静态资源。

      当然,这只是静态资源

      当请求内容为 index.php 时,WebServer 发现这并不是一个静态文件,之后会根据配置来寻找 PHP 解析器来处理这个请求。

      找到 PHP 解析器之后,怎么传递数据呢?必须使用大家都明白的的一个东西吧,就像 英语 -> 英语交流, 汉语->汉语交流,英语->汉语->无法交流(不明白对方说的什么);

      CGI就是规定要传哪些数据、以什么样的格式传递给后方处理这个请求的协议。仔细想想,你在PHP代码中所有的数据是怎么来的?

      

      所以,当收到 /index.php 这个请求后

        1:会启动CGI程序【PHP解释器】。

        2:之后CGI会启动一个进程解析 php.ini ,初始环境,处理请求

        3:在已规定规定好的CGI格式返回给 WebServer 。

        4:销毁这个进程。

        5:WebServer 在把结果返回给浏览器

      

      CGI是个协议,是为了保证web server传递过来的数据是标准格式的

    Fastcgi 是干什么的?

      这里就需要说一下 PHP-CGI 的缺点了,通过上面关于CGI的描述,发现 CGI 的特点

        请求->启动一个进程处理->处理完销毁这个进程

      CGI在请求时反复加载,这也正是 CGI 性能低下的主要原因,正是应为这样,才有了Fastcgi。

      

      定义:WEB服务器与处理程序之间通信的一种协议,是CGI的改进方案。

      

      不同【也可以说是特点吧】: 

        1:fastcgi 是一个常驻型的CGI,可以一直运行,在请求时,不会fock一个新的进程来处理。

        2:CGI 解释器进程在内存中保持,以此来获得更好的性能

       

      Fastcgi 工作流程:

        1:在Web Server启动时同时载入 Fastcgi 进程管理器

        2:Fastcgi进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待WebServer的连接

        3:当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。 Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。

        4:FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。

        5:  FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。在CGI模式中,php-cgi在此便退出了。

      简单来说:

        比如我家要装修,装修材料不知道什么时候来。

        CGI是:

          装修材料来->雇工人->干活->解雇工人。

          费时费力。

        Fastcgi:

          先雇几个工人等着->不管什么时候材料来->干活->继续等着

      总结:Fastcgi就是用来提高CGI程序性能的。

    PHP-FPM 是干什么的? 

      Fastcgi 比 CGI 好用,我们为什么不用,于是 被PHP官方收了。

      大家都知道,PHP解释器是PHP-CGI,但是PHP-CGI是个CGI程序,自己本身只能解析请求,并不能对进程进行管理

      所以就出现了一些可以管理 PHP-CGI 进程的程序。

      PHP-FPM 也就是这样。

      总结:php-fpm是fastcgi进程的管理器,用来管理fastcgi进程的

    总结:

      fastcgi是一个协议,php-fpm实现了这个协议。

      php-fpm的管理对象是php-cgi。但不能说php-fpm是fastcgi进程的管理器,因为前面说了fastcgi是个协议,似乎没有这么个进程存在,就算存在php-fpm也管理不了他(至少目前是).

      

    参考:

      搞不清FastCgi与PHP-fpm之间是个什么样的关系

      

  • 相关阅读:
    underscore.js,jquery.js源码阅读
    css3动画知识点
    ajax防止重复提交
    jquery data属性的使用
    文字换行
    vue的生命周期
    iphone与安卓的兼容性问题汇总
    python 上下文管理器
    form 校验
    常用的字段和字段参数
  • 原文地址:https://www.cnblogs.com/25-lH/p/9212722.html
Copyright © 2011-2022 走看看