杂谈PHP极少关注的问题

本话题来自于我使用PHP进行网页爬虫的一次经历。对于一个web开发者来说,PHP解释器本身却知之甚小,实在是惭愧呐!

首先这个话题要从几个提问开始。

PHP是什么?

外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”,是一种通用开源脚本语言。

所谓超文本预处理器本意是在HTML等这样的文本发送给浏览器前先进行服务器端的处理,从而实现动态发送原本静态的文件。PHP创始人本意是为了提供动态网页开发的便捷性,为web开发提供了预处理模块,所以说早期的PHP更像是一款web开发工具集,后来PHP开发变得庞大,独立成为一个解释器,并有了自己的语言规范。

知道起源的原因是需要我们明白一点:PHP是为web开发而生,但后来他太强了独立成了新语言!

故而PHP最原始的思想是与web服务器进行精密的结合,那么如何将语言和服务器软件结合?这就引发下面的问题了。

web服务器是什么?

诸如:Nginx,apache,IIS,tomcat,还有一些语言内置诸如nodejs,能提供web功能的软件,实现http协议的服务软件都称为web软件,安装了这些软件的服务器就叫做web服务器。(web与http关系就是,web是一个建立在http协议上的软件集合,web软件是一种实现,http只是一种协议)。web软件最基础的功能是request,response,也就是能处理用户的请求和响应他们。所以PHP,Python,ruby什么的语言本身与他们没有半毛钱的关系。

PHP(语言)与apache(web软件)的结合?

php_mod

提到PHP如何在apache的服务器上跑起来,就得提到apache下的一个模块,php_mod,就是这个模块让PHP解释器成为apache的一个子进程,子模块,让apache可以创建调用PHP进程,从而实现了所谓的LAMP,WAMP架构。

这种情况下php和apache是一种从属关系,apache启动时需要加载php模块,读取php.ini文件,一个最明显的特点是:在CGI模式下修改php.ini后不需要重启web服务器,而php_mod模式下修改php.ini则需要重启apache。

php如何与Nginx结合?

fast-cgi

提到nginx如何跑php,就不得不提到fast-cgi,要说fast-cgi就得说cgi是个什么东西。

cgi:协议,web软件和脚本语言之间通信的规范,目的就是让web软件能够规范调用那些脚本语言,诸如php,python,js等的解释器。

fast-cgi:实现,fast-cgi就是cgi的一种实现,Nginx用的就是这种实现,所以Nginx可以和php进行“通信”。

Nginx这种cgi模式与apache最大区别就是,php与nginx两个软件互相独立运行,Nginx需要执行php文件就交给php-fpm去做,处理完结果按照cgi规范返回给Nginx,Nginx处理完发送给用户。

除此以外,fast-cgi在cgi原有规范上还做了改进,cgi原本的规定是每一个请求都创建一个新的进程或者线程,结束后关闭,这样最大缺点是一开一关很消耗性能。于是fast-cgi的做法是在web服务器同时也启动一个进程,并预先启动子进程,线程,放在进程池中等待web请求过来,这样nginx一旦有请求过来,就能立马进行处理,不再一开一关进程了,这样效率,性能得到显著的提升。

正是因为cgi只是一个通信协议,它还支持分布式的运算,即fast-cgi程序可以在网站服务器以外的主机上执行并且接受来自其他网站服务器的请求。

FastCGI整个流程:

  1. Web server启动时载入FastCGI进程管理器
  2. FastCGI自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web server的请求
  3. 当请求Web server时,Web server通过socket请求FastCGI进程管理器,FastCGI进程管理器选择并连接到一个CGI解释器,Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi
  4. FastCGI子进程处理请求完成后将标准输出和错误从同一连接返回给Web server,当FastCGI子进程结束后请求便结束。FastCGI子进程接着等待处理来自FastCGI进程管理器的下一个连接,在CGI模式中,php-cgi在此便退出了。

php-fpm

php-fpm是php的fast-cgi的进程管理器。

PHP可以是一门独立的语言

php-cli

早就说过,现在的php已经是一门独立的脚本语言,所以php提供了cli编程,GUI编程,还保留了最重要的web编程。php-cli实际就是一个语言解释器,如果使用php只是进行爬虫,算法开发,只需要安装php-cli即可,什么cgi,fpm都不需要了,在windows下称作php.exe,只要有了cli,直接就可以在cmd下解析php文件了。

PHP自带web服务器

很多人用多了apache,nginx,并不知道php和nodejs一样,自带了webserver模块,可以直接通过php启动80端口监听的webserver。

如下:

php -S 127.0.0.1:8080 -t /var/www/html/

杂谈php之什么是cgi,fastcgi,fpm,cli,mod的更多相关文章

  1. Web服务器和动态语言如何交互--CGI&FastCGI&FPM浅谈

    一个用户的Request是如何经过Web服务器(Apache,Nginx,IIS,Light)与后端的动态语言(如PHP等)进行交互并将结果返回给用户的呢? 本文浅谈个人观点,可能有误,欢迎拍砖,共同 ...

  2. 记录一次自己对nginx+fastcgi(fpm)+mysql压力测试结果

    nginx + fastcgi(fpm) 压力测试: CentOS release 5.9 16核12G内存 静态页面: 并发1000,压测200秒,测试结果: 系统最大负载5.47 成功响应: 25 ...

  3. Nginx + CGI/FastCGI + C/Cpp

    接着上篇<Nginx安装与使用>,本篇介绍CGI/FASTCGI的原理.及如何使用C/C++编写简单的CGI/FastCGI,最后将CGI/FASTCGI部署到nginx.内容大纲如下: ...

  4. 漫谈CGI FastCGI WSGI

    作者:auxten链接:https://zhuanlan.zhihu.com/p/20054757来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. CGI(Common ...

  5. [转] Nginx + CGI/FastCGI + C/Cpp

    接着上篇<Nginx安装与使用>,本篇介绍CGI/FASTCGI的原理.及如何使用C/C++编写简单的CGI/FastCGI,最后将CGI/FASTCGI部署到nginx.内容大纲如下: ...

  6. PHP运行模式(cgi,fast-cgi,cli, ISAPI ,web模块模式)【转载】

    PHP运行模式有5钟: 1)cgi 通用网关接口(Common Gateway Interface))2)fast-cgi 常驻 (long-live) 型的 CGI3)cli  命令行运行   (C ...

  7. php五大运行模式CGI,FAST-CGI,CLI,ISAPI,APACHE模式浅谈

    做 php 开发的应该都知道 php 运行模式概念吧,本文将要和大家分享的是关于php目前比较常见的五大运行模式:包括cgi .fast-cgi.cli.isapi.apache模块的DLL ,下面作 ...

  8. cgi fast-cgi php-fpm区别

    php-cli 是php在系统执行的程序,直接执行php文件: cgi和fast-cgi的区别1.cgi和fast-cgi都是php解析协议,负责解析服务器分发过来的php动态文件:cgi程序就会去解 ...

  9. php五大运行模式CGI,FAST-CGI,CLI,ISAPI,APACHE模式

    做 php 开发的应该都知道 php 运行模式概念吧,本文将要和大家分享的是关于php目前比较常见的五大运行模式:包括cgi .fast-cgi.cli.isapi.apache模块的DLL ,下面作 ...

随机推荐

  1. SQL 一个【OR】属性给你带来了怎样的麻烦

    关于 数据库  or   的用法,就不说了     讲讲OR对数据库性能有多大的杀伤力,以后线上的项目如果是数据量很大的表,一定不要用OR来查询 今天在工作的时候,同事遇到了SQL优化的问题,让我帮忙 ...

  2. 吴裕雄--天生自然 JAVA开发学习:String 类

    public class StringDemo{ public static void main(String args[]){ char[] helloArray = { 'r', 'u', 'n' ...

  3. Python opencv计算批量图片的BGR各自的均值

    #coding:utf-8 #第一种方式 很慢很慢 自己写的如何计算均值 ''' import cv2 import os def access_pixels(frame): print(frame. ...

  4. tif图片压缩

    tif图片在ImageIo.read获取时,返回为空,导致无法使用,百度了很久,很多人说jai可以,便去看了下,总结如下: public static void CompressPic(String ...

  5. [Algo] 397. Right Shift By N Characters

    Right shift a given string by n characters. Assumptions The given string is not null. n >= 0. Exa ...

  6. debian8.8安装sougou输入法

    传送门:http://www.cnblogs.com/ligongzi/p/6137601.html 亲测可用

  7. xcode6 Images.xcassets添加LaunchImage

    不使用LaunchScreen.xib,通过Images.xcassets新建LaunchImage做登陆界面 步骤: 1.创建LaunchImage

  8. logstash 使用glusterfs网络存储偶发性文件解析异常的问题

    其实问题到现在为止也没有解决 因为服务是部署在k8s上,挂载的,偶发性的出现文件解析异常 bom头已经验证过了 手动重新解析这些文件完全正常,问题无法复现,文件本身并没有问题. 最后怀疑到了最不该怀疑 ...

  9. raw_input|active:|continue|break|

    a = "please" b = "say something:" c =a+b m = 0 a = True while a: m = int(raw_inp ...

  10. element ui 自定义异步验证

    之前提到过,axios是一个异步请求,但是很多时候我们都需要同步请求,比如在element的表单验证中需要验证一个用户名是否存在的时候,异步请求好像就不太好用了.前边博客中提到过,这种情况可以用es6 ...