一、案例分析
WEB 中:Web Server 一般指 Apache、Nginx、IIS、Lighttpd、Tomcat 等服务器,Web Application 一般指 PHP、Java、Asp.net 等应用程序。
1.1、分析
当 Web Server 收到 index.php 这个请求后,会启动对应的 CGI 程序,这里就是 PHP 的解析器。接下来 PHP 解析器会解析 php.ini 文件,初始化执行环境,然后处理请求,再以规定 CGI 规定的格式返回处理后的结果,退出进程,Web server 再把结果返回给浏览器。这就是一个完整的动态 PHP Web 访问流程,接下来再引出这些概念,就好理解多了。
1.2、名称解释
①、CGI:是 Web Server 与 Web Application 之间数据交换的一种协议。
CGI 的英文是(COMMON GATEWAY INTERFACE)公共网关接口,它的作用就是帮助服务器与语言通信,这里就是 nginx 和 php 进行通信,因为 nginx 和 php 的语言不通,因此需要一个沟通转换的过程,而 CGI 就是这个沟通的协议。
nginx 服务器在接受到浏览器传递过来的数据后,如果请求的是静态的页面或者图片等无需动态处理的则会直接根据请求的 url 找到其位置然后返回给浏览器,这里无需 php 参与,但是如果是一个动态的页面请求,这个时候 nginx 就必须与 php 通信,这个时候就会需要用到 cgi 协议,将请求数据转换成 php 能理解的信息,然后 php 根据这些信息返回的信息也要通过 cgi 协议转换成 nginx 可以理解的信息,最后 nginx 接到这些信息再返回给浏览器。
对于 CGI 来说,每一个 Web 请求 PHP 都必须重新解析 php.ini、重新载入全部扩展,并重初始化全部数据结构。而使用 FastCGI,所有这些都只在进程启动时发生一次。一个额外的好处是,持续数据库连接(Persistent database connection)可以工作。
②、FastCGI:同 CGI,是一种通信协议,但比 CGI 在效率上做了一些优化。同样,SCGI 协议与 FastCGI 类似。
传统的 cgi 协议在每次连接请求时,会开启一个进程进行处理,处理完毕会关闭该进程,因此下次连接,又要再次开启一个进程进行处理,因此有多少个连接就有多少个 cgi 进程,这也就是为什么传统的 cgi 会显得缓慢的原因,因此过多的进程会消耗资源和内存。
而 fast-cgi 则是一个进程可以处理多个请求,和上面的 cgi 协议完全不一样,cgi 是一个进程只能处理一个请求,这样就会导致大量的 cgi 程序,因此会给服务器带来负担。
③、PHP-CGI:是 PHP (Web Application)对 Web Server 提供的 CGI 协议的接口程序。
php-cgi 是 php 提供给 web serve 也就是 http 前端服务器的 cgi 协议接口程序,当每次接到 http 前端服务器的请求都会开启一个 php-cgi 进程进行处理,而且开启的 php-cgi 的过程中会先要重载配置,数据结构以及初始化运行环境,如果更新了 php 配置,那么就需要重启 php-cgi 才能生效,例如phpstudy 就是这种情况。
④、PHP-FPM:PHP FastCGI Process Manager,是 PHP(Web Application)对 Web Server 提供的 FastCGI 协议的接口程序,额外还提供了相对智能一些任务管理。
php-fpm 是 php 提供给 web serve 也就是 http 前端服务器的 fastcgi 协议接口程序,它不会像php-cgi 一样每次连接都会重新开启一个进程,处理完请求又关闭这个进程,而是允许一个进程对多个连接进行处理,而不会立即关闭这个进程,而是会接着处理下一个连接。它可以说是 php-cgi的一个管理程序,是对 php-cgi 的改进。
php-fpm 会开启多个 php-cgi 程序,并且 php-fpm 常驻内存,每次 web serve 服务器发送连接过来的时候,php-fpm 将连接信息分配给下面其中的一个子程序 php-cgi 进行处理,处理完毕这个 php-cgi 并不会关闭,而是继续等待下一个连接,这也是 fast-cgi 加速的原理,但是由于 php-fpm 是多进程的,而一个 php-cgi 基本消耗 7-25M 内存,因此如果连接过多就会导致内存消耗过大,引发一些问题,例如 nginx 里的 502 错误。
PHP-FPM 会创建一个主进程,控制何时以及如何将 HTTP 请求转发给一个或多个子进程处理。PHP-FPM 主进程还控制着什么时候创建(处理 Web 应用更多的流量)和销毁(子进程运行时间太久或不再需要了)PHP 子进程。
PHP-FPM 进程池中的每个进程存在的时间都比单个 HTTP 请求长,可以处理 10、50、100、500或更多的 HTTP 请求。
同时 php-fpm 还附带一些其他的功能:
例如平滑过渡配置更改,普通的 php-cgi 在每次更改配置后,需要重新启动才能初始化新的配置,而 php-fpm 是不需要,php-fpm 分将新的连接发送给新的子程序 php-cgi,这个时候加载的是新的配置,而原先正在运行的 php-cgi 还是使用的原先的配置,等到这个连接后下一次连接的时候会使用新的配置初始化,这就是平滑过渡。
1.3、升级过程
二、详细图解
① Web Server 启动时载入 FastCGI 进程管理器(Apache Module 或 IIS ISAPI 等)
② FastCGI 进程管理器自身初始化,启动多个 CGI 解释器进程(可建多个 php-cgi),并等待来自 Web Server 的连接。
③ 当客户端请求到达 Web Server 时,FastCGI 进程管理器选择并连接到一个 CGI 解释器。Web server 将 CGI 环境变量和标准输入发送到 FastCGI 子进程 php-cgi。
④ FastCGI 子进程完成处理后,将标准输出和错误信息从同一连接返回 Web Server。当 FastCGI 子进程关闭连接时,请求便告处理完成。FastCGI 子进程接着等待,并处理来自 FastCGI 进程管理器(运行在Web Server中)的下一个连接。 在 CGI 模式中,php-cgi 在此便退出了。
三、vc、x86、x86、ts、nts
①、VC版本(对应的运行库)
VC6
VC7(Microsoft Visual C++ 2003)
VC8(Microsoft Visual C++ 2005)
VC9(Microsoft Visual C++ 2008)
VC10(Microsoft Visual C++ 2010)
VC11(Microsoft Visual C++ 2012)
VC12(Microsoft Visual C++ 2013)
VC14(Microsoft Visual C++ 2015)
Microsoft Visual C++(简称Visual C++、MSVC、VC++或VC)是微软公司的 C++ 开发工具,具有集成开发环境,可提供编辑 C 语言,C++ 以及 C++/CLI等编程语言。VC++集成了便利的除错工具,特别是集成了微软Windows视窗操作系统应用程序接口(Windows API)、三维动画DirectX API,Microsoft .NET框架。
②、ts 与 nts 的区别
Windows 版的 PHP 从版本 5.2.1 开始有 Thread Safe 和 NoneThread Safe 之分。
Thread Safe 是线程安全,执行时会进行线程(Thread)安全检查,以防止有新要求就启动新线程的CGI 执行方式而耗尽系统资源。
Non Thread Safe 是非线程安全,在执行时不进行线程(Thread)安全检查。
③、PHP 的两种执行方式:ISAPI 和 FastCGI。
ISAPI 执行方式是以 DLL 动态库的形式使用,可以在被用户请求后执行,在处理完一个用户请求后不会马上消失,所以需要进行线程安全检查,这样来提高程序的执行效率,所以如果是以 ISAPI 来执行 PHP,建议选择 ThreadSafe 版本。
而 FastCGI 执行方式是以单一线程来执行操作,所以不需要进行线程的安全检查,除去线程安全检查的防护反而可以提高执行效率,所以,如果是以 FastCGI 来执行 PHP,建议选择 NonThread Safe 版本。
④、PHP后面的X86、X64是什么意思?
CPU 分为 64 位 与 32 位。 64 位与 32 位 的指令集不同。
X64 指该版本专为 64 位CPU设计, X86 指该版本为 32 位CPU设计。一些小软件由于编译生成的文件小,可以将 32 位 与 64 位 组合起来,但一些大的软件就不行,为减小体积,必须予以分开。
X64 只支持 64 位 CPU 与 系统,而 X86 可以同时支持两种 CPU,只是在 X64 CPU上会有性能损失。