杂谈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. geodjango七日学习笔记 (7.30整理本地笔记上传到网络)

    第一天进行到现在,在开端的尾巴,想起来写一个学习笔记, 开发环境已搭好,用的是pycharm 环境是本机已有的interpreter python3.7   接下来要做的是新建一个geodjango项 ...

  2. 面试必问之http以及浏览器相关知识

    /** 1.HTTP以及HTTPS概念 HTTP是超文本传输协议,是一个用于传输超媒体文档的应用层协议,被用于在web浏览器和网站服务器之间,以明文方式传递信息, 不提供任何方式的饿数据加密,因此使用 ...

  3. py02_02:pyc的解释

    1. Python是一门解释型语言吗? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在.如果是解释型语言 ...

  4. 在mybatis框架中,延迟加载与连表查询的差异

    1.引子 mybatis的延迟加载,主要应用于一个实体类中有复杂数据类型的属性,包括一对一和一对多的关系(在xml中用collection.association标签标识).这个种属性往往还对应着另一 ...

  5. oracle 学习(三)pl/sql语言函数

    系统内置函数 数学运算函数 字符串函数 统计函数 日期函数 用户定义函数:存储在数据库中的代码块,可以把值返回到调用程序.调用时如同系统函数一样 参数模式 IN模式:表示该参数时输入给函数的参数 OU ...

  6. 2×c列联表|多组比例简式|卡方检验|χ2检验与连续型资料假设检验

    第四章 χ2检验 χ2检验与连续型资料假设检验的区别? 卡方检验的假设检验是什么? 理论值等于实际值 何条件下卡方检验的需要矫正?如何矫正? 卡方检验的自由度如何计算? Df=k-1而不是n-1 卡方 ...

  7. Photoshop和Halcon如何锐化彩色图像不伤其颜色

    锐化图像是摄影中的一步重要操作. 锐化是通过颜色提纯达到锐化的目的.一旦锐化过度,照片很容易就会出现不自然的色斑,或溢色效果. 我们以Photoshop中的“USM锐化滤镜”为例:(为了使效果明显,我 ...

  8. [HNOI2019]白兔之舞(矩阵快速幂+单位根反演)

    非常抱歉,这篇文章鸽了.真的没时间写了. #include<bits/stdc++.h> using namespace std; typedef long long ll; #defin ...

  9. ubuntu14.04安装32位库

    sudo dpkg --add-architecture i386 sudo apt update

  10. 吴裕雄--天生自然 PYTHON3开发学习:File(文件) 方法

    # 打开文件 fo = open("runoob.txt", "wb") print("文件名为: ", fo.name) # 关闭文件 f ...