解读web服务器与php的工作原理
最近决定重读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的工作原理的更多相关文章
- Web服务器与浏览器的实现原理
Web服务器与浏览器的实现原理 第一部分 为什么会出现web程序? 单机程序不能共享功能的特性导致了客户机服务器模式的诞生 有一台服务器有特定功能的程序 其他计算机通过客户端程序与服务器交流间接使用 ...
- HTTP之Web服务器是如何进行工作的!
Web服务器是如何进行工作的 ====================文章摘自<HTTP权威指南>====================== 1. 建立连接—接收一个客户端的连接,或者 ...
- JavaWeb从0开始学(一)-----搭建第一个Web应用程序与JSP工作原理
以往学习的时候大多是看完书或者看完视频,动手实践一下就OK了.然而过了一段时间我发现东西都忘差不多了,需要复习才能重新掌握.现在开始学习JavaWeb了,我将在这里记录自己的学习的一点一滴,不仅便于自 ...
- Java web每天学之Servlet工作原理详情解析
上篇文章中我们介绍了Servlet的实现方式以及Servlet的生命周期,我们这篇文章就来介绍一下常用对象. 点击回顾:<Java Web每天学之Servlet的工作原理解析>:<J ...
- struts2中struts.xml和web.xml文件解析及工作原理
web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp ...
- Nginx系列一:正向代理和反向代理、Nginx工作原理、Nginx常用命令和升级、搭建Nginx负载均衡
转自https://www.cnblogs.com/leeSmall/p/9351343.html 仅供个人学习 一.什么是正向代理.什么是反向代理 1. 正向代理,意思是一个位于客户端和原始服务器( ...
- 自己动手实现一个WEB服务器
自己动手实现一个 Web Server 项目背景 最近在重温WEB服务器的相关机制和原理,为了方便记忆和理解,就尝试自己用Java写一个简化的WEB SERVER的实现,功能简单,简化了常规服务器的大 ...
- Visual Studio中用于ASP.NET Web项目的Web服务器
当您在 Visual Studio 中开发 Web 项目时,需要 Web 服务器才能测试或运行它们. 利用 Visual Studio,您可以使用不同的 Web 服务器进行测试,包括 IIS Expr ...
- 如何用PHP/MySQL为 iOS App 写一个简单的web服务器(译) PART1
原文:http://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app 作为一个i ...
随机推荐
- Linux Platform驱动模型(二) _驱动方法
在Linux设备树语法详解和Linux Platform驱动模型(一) _设备信息中我们讨论了设备信息的写法,本文主要讨论平台总线中另外一部分-驱动方法,将试图回答下面几个问题: 如何填充platfo ...
- TypeScript入门 2--代码调试
代码调试(debug)是日常开发中必不可少的手段之一,无法进行代码调试会让我们痛苦不已,本文主要介绍如何调试TypeScript代码 很多刚接触TypeScript的人或许有疑问,我们编写的TypeS ...
- CSS中:visited的隐私保护
CSS 伪类 (Pseudo-classes) 锚伪类:在支持 CSS 的浏览器中,链接的不同状态都可以不同的方式显示,这些状态包括:活动状态,已被访问状态,未被访问状态,和鼠标悬停状态. a:lin ...
- didReceiveMemoryWarning-内存警告处理方法-iOS
前言 当app出现内存警告的时候会怎么办 正文 ios6.0之后,内存警告的viewDidUnload 被屏蔽,即又回到了ios3.0的时期的内存管理方式. iOS6.0及以上版本的内存警告:调用di ...
- Maven入门,Maven项目的创建,nexus 2.x搭建私服以及Maven多模块项目创建
maven的了解做一个总结,以便日后查阅, 若有不足之处,还望指出,学无止境 当然也能起到入门效果. 一,搭建maven私服 1.工具 a. Nexus 2.5.1-01 b. Maven 3.3.9 ...
- 好用的JS压缩工具—JSCompress
好用的JS压缩工具-JSCompress http://www.jscompress.cn/ 1.容量体积小 2.可视化.自动化 3.独立性
- Android开发8:数据存储(二)——SQLite数据库和ContentProvider的使用
前言 啦啦啦各位小伙伴们许久不见了~学期末和过年期间自己忙着做其他事没能及时更新Android开发系列课程的博客,实在是罪过罪过~ 好啦~废话不多说,进入我们今天的主题.今天我们将和大家学习其他的数据 ...
- devexpress chartcontrol实现非连续点数据的显示
1.先上图: 其中暗红的曲线中数据不连续的,在实际开发中可能也会遇到这种情况,由于断电或其他原因导致部分日期数据无法采集,如果按一般情况来显示可能会显示如下图所示: 图中可以看出非连续曲线中,3月5号 ...
- Github网站加载不完全,响应超时,如何解决
Github是一个代码托管平台和开发者社区,开发者可以在Github上创建自己的开源项目并与其他开发者协作编码.毫不夸张地说,高效利用Github是一个优秀的程序员必备的基本素质.可是,有的用户在打开 ...
- 架构师之路——里氏替换原则LSP
定义: 如果对每一个对类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型. 内容: 里氏替换原则通 ...