最近决定重读php手册(好吧,其实之前也没怎么读,尴尬脸),既然是重读,那就从php的安装开始咯,然后被手册中出现的各种新词搞懵逼了,什么cgi、fastcgi、sapi、fpm,苍天啊,这些都是什么鬼?经过一番谷歌、百度、知乎,自己总结出一点浅薄的知识,暂且记录,以后有新发现再回来填坑。

还是先简单说一下一个完整的请求过程吧。

  • 首先用户点击一个链接,发起一个url请求
  • web服务器会判断这是一个静态的请求,还是动态的。如果是静态的直接查找资源返回给浏览器,这里主要说一下动态的请求
  • 如果是一个动态的请求,web服务器是没有能力处理的,需要交给一些后台的编程语言处理,比如说php、java、asp等等。敲黑板啦,请注意这里,web服务器像apache、nginx等都是用C语言写的,如何和不同的后端语言进行交流呢?

    这里就有不同的方式,按照php的流程控制,这里应该来一个switch语句或者if else语句,哈哈。

第一种:官方手册称之为handler(谷歌翻译为:处理程序)

工作流程大概是这样的,他会直接加载php模块,每一次动态的请求都会产生一个进程,但是他们两者之间还是没办法交流啊,是的,php会提供一个统一的接口sapi(Server Application Programming Interface)来和web服务器交流(至于到底是哪种接口,怎么工作的,我还不清楚,希望有大牛帮忙指点)。

这种方式有两个缺点:

(1)每一次的请求都会产生一个进程,所有如果遇到高并发的时候,就很容易死翘翘了。

(2)php和web服务器的耦合度很高,如果出现问题,很难判断到底是谁的错误。

以前没理解的一些细节:

以前我们在配置服务器的时候,让apache能够解析php代码,是这样修改httpd.conf文件的

//加载php模块
LoadModule php5_module D:/php/php5apache2_2.dll
AddType application/x-httpd-php .php //添加index.php
<IfModule dir_module>
DirectoryIndex index.html index.htm index.php
</IfModule>

注意:上面的web服务器也就是apache第一个先找的文件是.html或者.htm文件为后缀的,因为这样的话就不需要和php通信了嘛,自己能办到的事就先不麻烦别人了

扯的有点远了,回来继续说第二种。

第二种:cgi的方式

cgi是sapi的一种实现方式。它的工作原理大概是这样的:web服务器要让php去处理动态请求,但是前面提到两者语言不通啊,就好比你和一个日本人交流,都听不懂对方说的话,怎么办,大家都说英语吧。这里也是一样,不过使用的是cgi。web服务器要告诉php我这边收到的HTTP header、url、post数据等,通过cgi这种标准协议,将数据传输过去,然后php通过cgi就会解析php.ini文件,初始化执行环境,处理请求。最后再通过cgi将处理的结果返回给服务器,服务器将数据返回给浏览器。

是不是一切都很完美,嗯,等等,如果遇到高并发怎么办?老兄,你可不可以快点?搞得和《疯狂动物城》里的“闪电”一样,你能不能早点把该办的事情办好,高并发来的时候可不可以多几个人手办事?

时间过了几年,“闪电”终于快退休了,出来了fastcgi。 它会和apache一起启动,启动一个master,解析配置文件,初始化执行环境,然后生成多个cgi,等待调用。一切都很完美,有一种金星完美手势的既视感。

但是童靴们,前面说过了,cgi是一种协议,fastcgi也是一种协议,它不过是比cgi要好点,但是终究改变不了本质,他自己是没有进程管理的。php-cgi是php官方自带的fastcgi管理器,但是很弱鸡呀,主要有以下两个缺点:

(1)php-cgi变更php.ini配置之后需要重启php-cgi才能让新的php-ini生效,不可以平滑重启(终于知道为什么每次更改配置文件之后要重启了)

(2)直接杀死php-cgi进程,php就不运行了。

后来php-fpm就诞生了,php-fpm能够调度php-fpmphp-cgi进程的程序,进行管理。

解读web服务器与php的工作原理的更多相关文章

  1. Web服务器与浏览器的实现原理

    Web服务器与浏览器的实现原理 第一部分 为什么会出现web程序? 单机程序不能共享功能的特性导致了客户机服务器模式的诞生  有一台服务器有特定功能的程序 其他计算机通过客户端程序与服务器交流间接使用 ...

  2. HTTP之Web服务器是如何进行工作的!

    Web服务器是如何进行工作的 ====================文章摘自<HTTP权威指南>====================== 1.  建立连接—接收一个客户端的连接,或者 ...

  3. JavaWeb从0开始学(一)-----搭建第一个Web应用程序与JSP工作原理

    以往学习的时候大多是看完书或者看完视频,动手实践一下就OK了.然而过了一段时间我发现东西都忘差不多了,需要复习才能重新掌握.现在开始学习JavaWeb了,我将在这里记录自己的学习的一点一滴,不仅便于自 ...

  4. Java web每天学之Servlet工作原理详情解析

    上篇文章中我们介绍了Servlet的实现方式以及Servlet的生命周期,我们这篇文章就来介绍一下常用对象. 点击回顾:<Java Web每天学之Servlet的工作原理解析>:<J ...

  5. struts2中struts.xml和web.xml文件解析及工作原理

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp ...

  6. Nginx系列一:正向代理和反向代理、Nginx工作原理、Nginx常用命令和升级、搭建Nginx负载均衡

    转自https://www.cnblogs.com/leeSmall/p/9351343.html 仅供个人学习 一.什么是正向代理.什么是反向代理 1. 正向代理,意思是一个位于客户端和原始服务器( ...

  7. 自己动手实现一个WEB服务器

    自己动手实现一个 Web Server 项目背景 最近在重温WEB服务器的相关机制和原理,为了方便记忆和理解,就尝试自己用Java写一个简化的WEB SERVER的实现,功能简单,简化了常规服务器的大 ...

  8. Visual Studio中用于ASP.NET Web项目的Web服务器

    当您在 Visual Studio 中开发 Web 项目时,需要 Web 服务器才能测试或运行它们. 利用 Visual Studio,您可以使用不同的 Web 服务器进行测试,包括 IIS Expr ...

  9. 如何用PHP/MySQL为 iOS App 写一个简单的web服务器(译) PART1

    原文:http://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app 作为一个i ...

随机推荐

  1. [转载] HTTP协议详解

    转自:http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx Author :Jeffrey 引言 HTTP是一个属于应用层的面向对象的 ...

  2. arcpy.mapping常用四大件-Layer

    arcpy.mapping常用四大件-Layer by 李远祥 图层是地图里面非常重要的组成,几乎所有的制图显示都与图层有关.首先它是连接数据与符号渲染的重要桥梁,其次在出版地图中,图层又与图例关联在 ...

  3. hadoop系列一:hadoop集群安装

     转载请在页首明显处注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/6384393.html 一:说明 此为大数据系列的一些博文,有空的话会陆续更新,包含大数据 ...

  4. 记一次阿里云Linux服务器安装.net core sdk的问题以及解决方法

    因为公司领导要求新的项目能跨平台部署,也就是说能部署到Linux服务器上,故新的项目采用了Asp.net mvc core 1.1 进行开发.开发过程一切都比较顺利,然后在之前申请试用的一台微软Azu ...

  5. asp.net core mvc剖析:KestrelServer

    KestrelServer是基于Libuv开发的高性能web服务器,那我们现在就来看一下它是如何工作的.在上一篇文章中提到了Program的Main方法,在这个方法里Build了一个WebHost,我 ...

  6. [Linux] PHP程序员玩转Linux系列-lnmp环境的搭建

    1.PHP程序员玩转Linux系列-怎么安装使用CentOS 在平常的工作中,我作为PHP程序员经常要搭建一下环境,这个环境就是Linux系统下安装nginx,php,mysql这三个软件,对软件进行 ...

  7. BZOJ 1076: [SCOI2008]奖励关(概率+dp)

    首先嘛,看了这么久概率论真的不错啊。看到就知道怎么写(其实也挺容易的= =) 直接数位dp就行了 CODE: #include<cstdio> #include<cstring> ...

  8. .Net程序员学用Oracle系列(18):PLSQL Developer 攻略

    1.功能说明及使用技巧 1.1.对象浏览器 1.2.SQL 窗口 1.3.测试窗口 1.4.命令窗口 1.5.图表窗口 1.6.报告窗口 1.7.右键菜单 1.8.快速登录技巧 1.9.其它 2.总结 ...

  9. Tree on the level UVa122

    很单纯的树的遍历,但是输入和方向好麻烦!!下面给出代码,题目来自UVa 122 #include<cstdio> #include<cstring> #include<v ...

  10. 【Scala】Scala之Methods

    一.前言 前面学习了Scala的Class,下面接着学习Method(方法). 二.Method Scala的方法与Java的方法类似,都是添加至类中的行为,但是在具体的实现细节上差异很大,下面展示一 ...