现在的位置: 首页 > 综合 > 正文

Web-Server 中 PHP 的两种工作方式

2019年11月01日 ⁄ 综合 ⁄ 共 1948字 ⁄ 字号 评论关闭

Web-Server 中 PHP 的两种工作方式

转载:http://www.studyday.net/2011/07/251

部分内容参考自这里,

这里

在项目生产环境的 Web-Server 中 PHP.exe 通常以两种工作方式工作, 一种是 Apache 中的模块化方式, 另一种是在 Nginx 中的 FastCGI 方式. 除此之外, PHP.exe 还有一种古老的运行方式: CGI 方式, 这种方式基本上已经被淘汰, 我们可以通过 CGI 方式来很好的理解前两种方式.

CGI 方式是:

01 #当 Web-Server 启动时:
02 1, Web-Server 只初始化自身.
03  
04 #web 请求处理过程是:
05 1, 用户(浏览器)发起一个 *.php 文件的请求给 Web-Server
06 2, Web-Server 调用 php.exe
07 3, php.exe 完成一系列的初始化动作(如: 解析 php.ini , 载入全部扩展, ...)
08 4, php.exe 初始化完成, 解释 *.php 文件, 返回结果给 Web-Server
09 5, Web-Server 释放掉 php.exe 占用的资源
10 6, Web-Server 将结果返回给用户(浏览器)

总的来说, cgi这种处理方式的特点就是每接到一个请求, Web-Server 都要 fork 出一个单独的 cgi 程序的进程来处理, 这种方式的缺点就是如果在高访问需求的情况下, cgi的进程fork就会成为很大的服务器负担, 想象一下数百个并发请求导致服务器 fork 出数百个进程就明白了.

FastCGI 方式是:

01 #当 Web-Server 启动时:
02 1, Web-Server 初始化自身
03 2, Web-Server 载入 FastCGI 进程管理器(通常是PHP-FPM: PHP FastCGI Process Manager)
04 3, FastCGI 进程管理器自身初始化,
05 4, FastCGI 进程管理器启动(初始化)多个 CGI 解释器进程并等待来自 Web-Server 的连接(通过
"ps -ef | grep php" 命令或在任务管理器中可看到多个 php-cgi.exe 进程)
06  
07 #web 请求处理过程是:
08 1, 用户(浏览器)发起一个 *.php 文件的请求给 Web-Server
09 2, Web-Server 通过 FastCGI 进程管理器选择并连接到一个空闲的 CGI 解释器
10 3, Web-Server 将 CGI 环境变量和标准输入发送到 FastCGI 子进程 php-cgi.exe
11 4, php-cgi.exe 完成处理后将标准输出和错误信息从同一连接返回 Web-Server
12 5, php-cgi.exe 接着等待并处理来自 FastCGI 进程管理器(运行在 WebServer中)的下一个连接请求
13 6, Web-Server 将结果返回给用户(浏览器)

总的来说, fastcgi是基于cgi架构的扩展, 他的核心思想就是在 Web-Server 和具体 cgi 程序之间建立一个智能的可持续的中间层, 统管 cgi 程序的运行, 这样 Web-Server 只需要将请求提交给这个层, 这个层再派生出几个可复用的 cgi 程序实例, 然后再把请求分发给这些实例, 这些实例是可控的, 可持续, 可复用的, 因此一方面避免了进程反复 fork, 另一方面又可以通过中间层的控制和探测机制来监视这些实例的运行情况, 根据不同的状况 fork 或者回收实例, 达到灵活性和稳定性兼得的目的.

FastCGI 方式跟 CGI 方式的区别是:

1          在web服务器方面                                在对数据进行处理的进程方面
2 CGI      fork 一个新的进程进行处理                       读取参数, 处理数据, 然后就结束生命期
3 FastCGI  用tcp方式跟远程机子上的进程或本地进程建立连接        要开启tcp端口, 进入循环, 等待数据的到来, 处理数据

模块化 方式是:

1 #当 Web-Server 启动时:
2 1, Web-Server 初始化时会将 php.exe 做为自身的一个模块加载, 这样实际上是将 Web-Server 与 php.exe 做了一个融合, 使 Web-Server 自身拥有了解释 *.php 的能力.

模块化方式运行 php.exe 能将 php.exe 插入到 Web-Server 自身的进程处理, 因此性能有很大改观.
但是这种方法也不是没有缺点的,
例如对于不同的 web server 要按照不同标准开发, 无法做到 Web-Server 无关性;
例如这将输入验证的工作转交给了Web-Server, 没办法自由处理;
例如一旦出现问题将影响整个web server处理流程;
例如插入 Web-Server 进程导致的无法以多用户标示运行, 无法处理虚拟主机权限等.

【上篇】
【下篇】

抱歉!评论已关闭.