最近决定重读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. 启动activity与使用Intent通信机制解析

    我们都知道,一个activity启动另一个activity最简单的方式就是使用startActivity方法: public void startActivity (Intent intent) 但是 ...

  2. GIS制图人员的自我修养(1)--制图误区

    GIS制图人员的自我修养 by 李远祥 最近一直坚持写GIS制图的技术专题,并不是为了要介绍有什么好的技术和方法去制图,而是要告诉所有从事这一方向的人员一个铁铮铮的实现--要做好GIS制图,必须加强自 ...

  3. Linux系统(三)系统基础扫盲大全

    序言 如果大家都爱装逼,一般会偏爱使用安装最小化的liunx系统,那么你的系统就不带图形化的桌面功能,这样对于一个想装B的初学者来说,Liunx就是黑漆马虎,一望无际的黑屏,黑屏,如何快速的对liun ...

  4. 安装第三方包web.py发生的错误

    今天新学到了python的模块方面的内容,我的版本是python2.7.13 想安装第三方包web.py的时候, 命令提示符 输入 pip install web.py 总是提示如下错误 You ar ...

  5. bugly集成了Tinker热更新

    介绍 热更新能力是Bugly为解决开发者紧急修复线上bug,而无需重新发版让用户无感知就能把问题修复的一项能力.Bugly目前采用微信Tinker的开源方案,开发者只需要集成我们提供的SDK就可以实现 ...

  6. 转:微信开发之使用java获取签名signature(贴源码,附工程)

    微信开发之使用java获取签名signature(贴源码,附工程) 标签: 微信signature获取签名 2015-12-29 22:15 6954人阅读 评论(3) 收藏 举报  分类: 微信开发 ...

  7. linux下安装Mysql 以及导入数据库

    1.下载mysql的rpm包,创建一个文件夹例如software来放置下面文件 可以通过wget下载具体的地址 (1)MySQL-server-5.6.10-1.rhel5.x86_64.rpm:My ...

  8. Asp.net mvc 知多少(八)

    本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问[http: ...

  9. JavaScript 毒瘤和糟粕(需要注意的地方)

    简介 我想这是在我总结JavaScript系列中最为需要注意的,最为重要的内容.你必须要去了解这些问题特性,才能准备好应对措施,这真的很重要. 毒瘤 全局变量 全局变量的存在的确是带来了方便,但是我觉 ...

  10. XML入门知识

    什么是XML? 答:指可扩展标记语言(eXtensible Markup Language),被设计用来传输和存储数据:标签没有被预定义.您需要自行定义标签:被设计为具有自我描述性. XML和HTML ...