php运行模式

来源:互联网 发布:淘宝生意参谋数据分析 编辑:程序博客网 时间:2024/06/05 05:31

当年在提交某个漏洞的时候,某src看了漏洞说可能是cgi除了问题。当年也不搞web安全,如今接触web安全也有段时日,就看看CGI到底是个啥。
php有4种运行模式,分别是cgi、fast-cgi、cli和服务器模块模式。

一、 CGI模式

CGI(Common Gateway Interface)通用网关接口,在此模式下,CGI相当于前端网页和后端php脚本执行环境的桥梁。

怎么理解这桥梁:我们拿WebServer是apache、后端是php来举例。假设用户请求:http://www.test.com/a.php,apache作为webserver的工作就是如何解析http协议。但是这里要执行后端脚本,Apache自身并不认识php啊,所以Apache需要请求php作为运行环境来执行用户的请求。这时候,具体怎么来请求php程序来执行脚本呢?php又如何把结果返回个Apache?这就是运行模式的问题。我们看一个图。

这里写图片描述

那么,在此运行模式下,存在一个问题,就是每Apache每次收一个请求的时候,就去调用php程序,当php执行完脚本之后,php进程自动结束。这时候,如果段时间类来了多个请求,php进程会被启动多次,即系统中存在多个php进程,并且启动过程比较慢,这样,对服务器性能有很大影响。即fork-and-execute。

二、fast-cgi模式

从大web和后端执行环境的机理上,fast-cgi和cgi是一样的。不同之处就体现在怎么解决cgi的fork-and-execute执行慢的问题。

不同之处是,在Apache启动后,apache会自动启动fast-cgi进程管理器。fast-cgi管理器启动之后,然后启动多个解释器子进程php-cgi,这种模式有点线程池的意思。

当一个req来临时,Apache会通知fast-cgi管理器选择一个php-cgi子进程来执行对应的脚本。php-cgi执行完php脚本之后,会把结果反馈给apache。这样一次req-res过程就完成。

总结这种模式,相当于php不在是接受了req之后在被启动,而是提前通过fast-cgi模式启动了,只是通过进程间通信机制来等来自Apache的任务请求,并且通过子进程的形式来处理并发请求,效率更高。示意图如下:

这里写图片描述

突发奇想,这种运行模式和Android上的App向系统服务发请求的过程有一点相似。

这里写图片描述

三、cli模式

这个指的是php在命令行中运行的模式。

四、Apache模块模式

Apach常常和php搭配形成LAMP。Apache把php作为一个模块集成在Apache中,就是模块模式。工作原理如下图:

这里写图片描述

0 0
原创粉丝点击