解读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 ...
随机推荐
- ssh无法远程登陆别的机器
ssh无法远程登陆别的机器,提示报错: ssh: symbol lookup error: ssh: undefined symbol: EVP_aes_128_ctr 解决方法如下: 给相应配置文件 ...
- css经典布局之左侧固定大小右侧自动适应
最近学习了一种经典布局,固定左侧或右侧的宽度,另一侧自适应宽度,此种布局挺常用,尤其是像后台,大部分都是采用这种结构,还比如像订餐类的APP,进入商家的时候,会出现一堆饭的列表,左侧是饭的分类,右侧是 ...
- JUnit4 与 JMock 之双剑合璧
引言 单元测试可以保证代码的质量,最大程度降低修复系统 bug 的时间和成本.能被称为测试的阶段有:单元测试.集成测试.系统测试和用户测试.修复系统 bug 的时间和成本随着这些阶段的推移呈指数级增长 ...
- angular 输入框实现自定义验证
此插件使用angular.js.JQuery实现.(jQuery的引入需在angular 之前) 用户可以 在输入框输入数据后验证 必填项.整数型.浮点型验证. 如果在form 里面的输入框验证,可以 ...
- C++ 中的 delete[] 机制剖析
本文简单总结了delete[]放在析构函数中VS放在主函数中的区别(针对自己定义类). delete原理简单剖析(摘至https://zhidao.baidu.com/question/1540902 ...
- Cordova的搭建
Cordova的搭建 cordova也叫phonegap,可以用来打包网页生成Android或iOS或其他平台的APP,它提供了一些native api,可以让网页调用本地函数,极大地增强了网页的功能 ...
- java学习笔记——Java多客户端与服务器通信
先说一下大概的思路: 应用多线程来实现服务器与多客户端之间的通信 1.服务器端创建ServerSocket,循环调用accept()等待客户端连接: 2.客户端创建一个Socket并请求与服务器端连接 ...
- Servlet支持上传多张图片
首先前端的表单是这个形式: <form target="_self" method="post" action="fileUploadMult ...
- linux下zookeeper 配置参数
-----------zookeeper 配置文件 clientPort ---服务的监听端口dataDir ---用于存放内存数据库快照的文件夹,同时用于集群的myid文件也存在这个文件夹里 (注意 ...
- Hibernate框架Criteria查询
本文章适合一些初学者 一.使用Criteria查询数据 1.条件查询 1.1:使用Criteria查询的步骤 1.使用Sess ...