杂谈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. ServiceComb 集成 Shiro 实践|火影专场发布

    Shiro简介 Apache Shiro是一款功能强大.易用的轻量级开源Java安全框架,它主要提供认证.鉴权.加密和会话管理等功能.Spring Security可能是业界用的最广泛的安全框架,但是 ...

  2. 一、早期(Early Stage)

    一.早期(Early Stage) 如果单纯从零基础开始,早期(Early Stage)应该是一到两个月(由于英语与中文差异比与其他语言大,中国同学至少两个月,但也不应过长.我们的经验是一般中国同学会 ...

  3. 数据分析-Numpy-Pandas

    补充上一篇未完待续的Numpy知识点 索引和切片 数组和标量(数字)之间运算 li1 = [ [1,2,3], [4,5,6] ] a = np.array(li1) a * 2 运行结果: arra ...

  4. 【C#并发】00概述

    摘自<C#并发编程经典实例>[美]Stephen Cleary 并发:同时做多件事情.终端用户利用并发功能,在输入数据库的同时相应用户输入.服务器应用并发,在处理第一个请求的同时响应第二个 ...

  5. 论文或github中一些通用思想

    (1) 云从 上海交大 ECCV2018 http://openaccess.thecvf.com/content_ECCV_2018/papers/Yao_Feng_Joint_3D_Face_EC ...

  6. Notification通知在OPPO手机上不弹出提示?

    oppo默认应用 不允许通知. 解决步骤:设置 通知与状态栏 通知管理 NotificationTest 允许通知

  7. ⼩程序中⽀持es7的async语法

    ⼩程序中⽀持es7的async语法 es7的 async 号称是解决回调的最终⽅案 在⼩程序的开发⼯具中,勾选 es6转es5语法 下载 facebook 的 regenerator 库中的 rege ...

  8. nm命令介绍

    一.参考文章 网址1:https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/nm.html 参考2: man nm 参考3:<linux ...

  9. Java自学-泛型 通配符

    Java 泛型通配符 ? extends super 的用法 示例 1 : ? extends ArrayList heroList<? extends Hero> 表示这是一个Hero泛 ...

  10. Juptyer中的图表显示参数

    from pylab import * import seaborn as sns # 图表显示参数 from IPython.display import display %matplotlib i ...