杂谈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。

如下:

  1. 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. 损失函数coding

    损失函数(Loss Function)和成本函数(Cost Function)之间有什么区别? 在此强调这一点,尽管成本函数和损失函数是同义词并且可以互换使用,但它们是不同的. 损失函数用于单个训练样 ...

  2. Juniper srx新增接口IP,使PC直连srx(转)

    转自:https://www.jianshu.com/p/bc27134bde3d Juniper srx新增接口IP,使PC直连srx 2018.11.19 14:24:15字数 424 概述 需求 ...

  3. 吴裕雄--天生自然 JAVA开发学习: 循环结构

    public class Test { public static void main(String args[]) { int x = 10; while( x < 20 ) { System ...

  4. PAT Advanced 1127 ZigZagging on a Tree (30) [中序后序建树,层序遍历]

    题目 Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree c ...

  5. java和数据库中所有的锁都在这了

    1.java中的锁 1.1 锁的种类 公平锁/非公平锁 可重入锁/不可重入 独享锁/共享锁 读写锁 分段锁 偏向锁/轻量级锁/重量级锁 自旋锁 1.2 锁详细介绍 1.2.1 公平锁,非公平锁 公平锁 ...

  6. 面向对象 part2 属性的特性

    6.1.1理解对象 创建自定义对象最简单的方式就是创建一个object实例.然后添加方法和实例 var person = new Object() person.name = "hi&quo ...

  7. windows之anaconda导入torch失败和pip install命令执行read time out

    昨天用jupyter导入torch还好好的呢,今天用就不行了,先是ImportError: DLL load failed: 找不到指定的模块.再是No such comm target regist ...

  8. JavaScript学习笔记 - 进阶篇(7)- 浏览器对象

    window对象 window对象是BOM的核心,window对象指当前的浏览器窗口. window对象方法: 注意:在JavaScript基础篇中,已讲解了部分属性,window对象重点讲解计时器. ...

  9. SLAM领域资源链接

    半闲居士高翔博客: https://www.cnblogs.com/gaoxiang12/ 视觉大佬冯兵博客: http://www.fengbing.net/ SLAMCN http://www.s ...

  10. Spring 的 IOC 和 AOP 的理解

    Spring 的 IOC 和 AOP 的理解: https://www.jianshu.com/p/bf1adc3b75e6 对Spring的核心(AOP和IOC)的理解(大白话) https://w ...