解读web服务器与php的工做原理

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

  • 首先用户点击一个连接,发起一个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服务器的耦合度很高,若是出现问题,很难判断究竟是谁的错误。html

之前没理解的一些细节:
之前咱们在配置服务器的时候,让apache可以解析php代码,是这样修改httpd.conf文件的java

//加载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通讯了嘛,本身能办到的事就先不麻烦别人了nginx

扯的有点远了,回来继续说第二种。
第二种: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

相关文章
相关标签/搜索