最近决定重读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. WebForm 控件(一)、连接数据库

    一.控件 [简单控件] (一)文字显示 1.Label → 在html中相当于span  <asp:Label ID="控件名 runat="server" Tex ...

  2. 如何用webbrowser获取ajax动态生成的网页的源码?

    1.步骤一:修改IE内核的版本(这个方法厉害了) public Form1() { InitializeComponent();int BrowserVer, RegVal; // get the i ...

  3. W3Cschool学习笔记——CSS3教程

    向 div 元素添加圆角: div { border:2px solid; border-radius:25px; -moz-border-radius:25px; /* Old Firefox */ ...

  4. node.js 的事件机制

    昨天到今天, 又看了一边node 的事件模块,  觉得很神奇~  分享一下  - -> 首先, 补充下对node 的理解: nodeJs 是一个单进程单线程应用程序, 但是通过事件和回调支持并发 ...

  5. ERP的基础管理-物料编码

    在企业ERP系统中,物料编码管理是所有数据的基础,可以这样说:"没有物料编码就没有ERP".实际上物料编码对于制造类企业供应链管理作用不可说不巨大,影响不可谓不深远,甚至我们在考虑 ...

  6. Spark Streaming实时写入数据到HBase

    一.概述 在实时应用之中,难免会遇到往NoSql数据如HBase中写入数据的情景.题主在工作中遇到如下情景,需要实时查询某个设备ID对应的账号ID数量.踩过的坑也挺多,举其中之一,如一开始选择使用NE ...

  7. uml视频系列(二)——uml的概述

    在与uml进行了第一次的接触后,就被uml的博学多才给迷住了,uml居然可以做这么多的东西.才思敏捷的uml是设计软件的好帮手. 你还在为自己的类图不会设计而感到无助吗?你还在为你的对象不好确定而感到 ...

  8. iOS Touch ID 身份认证

    iOS Touch ID 身份认证 iOS 8 及以后录了指纹的设备可以使用 touch ID 进行身份认证,指纹符合录入的指纹才能认证成功. 步骤 导入 LocalAuthentication 框架 ...

  9. python书籍推荐

    python书籍推荐列表: 技巧:关于如何在windows平台上行获取目录下的文件名称.(我的python书籍的位置E:\Python\Python_book) D:\>e: E:\>cd ...

  10. (三) Angular2项目框架搭建心得

    前言: 在哪看到过angular程序员被React程序员鄙视,略显尴尬,确实Angular挺值得被调侃的,在1.*版本存在的几个性能问题,性能优化的"潜规则"贼多,以及从1.*到2 ...