杂谈php之什么是cgi,fastcgi,fpm,cli,mod
杂谈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整个流程:
- Web server启动时载入FastCGI进程管理器
- FastCGI自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web server的请求
- 当请求Web server时,Web server通过socket请求FastCGI进程管理器,FastCGI进程管理器选择并连接到一个CGI解释器,Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi
- 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的更多相关文章
- Web服务器和动态语言如何交互--CGI&FastCGI&FPM浅谈
一个用户的Request是如何经过Web服务器(Apache,Nginx,IIS,Light)与后端的动态语言(如PHP等)进行交互并将结果返回给用户的呢? 本文浅谈个人观点,可能有误,欢迎拍砖,共同 ...
- 记录一次自己对nginx+fastcgi(fpm)+mysql压力测试结果
nginx + fastcgi(fpm) 压力测试: CentOS release 5.9 16核12G内存 静态页面: 并发1000,压测200秒,测试结果: 系统最大负载5.47 成功响应: 25 ...
- Nginx + CGI/FastCGI + C/Cpp
接着上篇<Nginx安装与使用>,本篇介绍CGI/FASTCGI的原理.及如何使用C/C++编写简单的CGI/FastCGI,最后将CGI/FASTCGI部署到nginx.内容大纲如下: ...
- 漫谈CGI FastCGI WSGI
作者:auxten链接:https://zhuanlan.zhihu.com/p/20054757来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. CGI(Common ...
- [转] Nginx + CGI/FastCGI + C/Cpp
接着上篇<Nginx安装与使用>,本篇介绍CGI/FASTCGI的原理.及如何使用C/C++编写简单的CGI/FastCGI,最后将CGI/FASTCGI部署到nginx.内容大纲如下: ...
- PHP运行模式(cgi,fast-cgi,cli, ISAPI ,web模块模式)【转载】
PHP运行模式有5钟: 1)cgi 通用网关接口(Common Gateway Interface))2)fast-cgi 常驻 (long-live) 型的 CGI3)cli 命令行运行 (C ...
- php五大运行模式CGI,FAST-CGI,CLI,ISAPI,APACHE模式浅谈
做 php 开发的应该都知道 php 运行模式概念吧,本文将要和大家分享的是关于php目前比较常见的五大运行模式:包括cgi .fast-cgi.cli.isapi.apache模块的DLL ,下面作 ...
- cgi fast-cgi php-fpm区别
php-cli 是php在系统执行的程序,直接执行php文件: cgi和fast-cgi的区别1.cgi和fast-cgi都是php解析协议,负责解析服务器分发过来的php动态文件:cgi程序就会去解 ...
- php五大运行模式CGI,FAST-CGI,CLI,ISAPI,APACHE模式
做 php 开发的应该都知道 php 运行模式概念吧,本文将要和大家分享的是关于php目前比较常见的五大运行模式:包括cgi .fast-cgi.cli.isapi.apache模块的DLL ,下面作 ...
随机推荐
- 201604-2 俄罗斯方块 Java
大家谁能帮我看看是哪里不对,提交到系统中是0分,在Eclipse中可以得出例子中的结果 思路: 题目中有两个关键点:如何模拟下落的过程,如何判断方块下落在哪里停止. 在数据的存储上,需要保存整个&qu ...
- 三、VIP课程:并发编程专题->01-并发编程之Executor线程池详解
01-并发编程之Executor线程池详解 线程:什么是线程&多线程 线程:线程是进程的一个实体,是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系 ...
- 编译Python文件
编译Python文件 一.编译Python文件 为了提高加载模块的速度,强调强调强调:提高的是加载速度而绝非运行速度.python解释器会在__pycache__目录中下缓存每个模块编译后的版本,格式 ...
- jacascript 滚动scroll
滚动 scroll scrollHeight 表示元素的总高度,包括由于溢出而无法展示在网页的不可见部分: scrollWidth 表示元素的总宽度,包括由于溢出而无法展示在网页的不可见部分: 没有滚 ...
- Linux设置环境变量PATH路径的两种方法
echo 'export dataPath=$HOME/data/pre' >> ~/.bash_profile 路径即刻生效: . .bash_profile 或 source .bas ...
- docker安装(centos-7)
centos7安装docker:Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker .通过 uname -r 命令 ...
- RDD(十)——案例实操
需求: 数据结构:时间戳,省份,城市,用户,广告,中间字段使用空格分割. 样本如下: 1516609143867 6 7 64 16 1516609143869 9 4 75 18 151660914 ...
- linux中 su 与 su - 的区别
linux中 su 与 su - 的区别 su只是切换了用户身份,shell环境仍然是切换前用户的shell环境 su -是用户和shell环境一起切换成. 备注:1.切换了shell环境会相应的用户 ...
- java连接外部接口获取数据工具类
package com.yqzj.util; import org.apache.log4j.LogManager;import org.apache.log4j.Logger; import jav ...
- Docker系列七: 使用Humpback管理工具管理容器(一款UI管理工具)
Humpback 可以帮助企业快速搭建轻量级的 Docker 容器云管理平台,若将你的 Docker 主机接入到 Humpback 平台中,就能够为你带来更快捷稳定的容器操作体验. 功能特点 Web操 ...