消息经过网络传输,到达了服务器端,最常见的服务器是Web服务器,做PHP的同学都知道FastCGI模式的PHP比普通PHP更高效,这篇就聊聊其中的原理。
古老但常见的CGI
Web服务器能解析HTTP请求,返回静态资源(HTML页、图片等),但要输出动态内容,必须得PHP/C#/Ruby/Java/Python/C/C++这些外部程序来实现。
早期有个技术叫CGI(Common Gateway Interface,通用网关接口),是用于Web服务器和外部程序之间传输数据的一种标准。一个简单的CGI程序(C++语言)如下:
#include <stdio.h> #include <stdlib.h> int main() { printf("Content-type: text/html\r\n\r\n"); printf("your name is:%s\n", getenv("QUERY_STRING")); return 0; }
浏览器访问这个CGI程序,就会显示:your name is:name=xxx
CGI规定了Web服务器如何和CGI程序之间传输数据,具体过程大体是这样:
1、Web服务器收到的请求信息后,启动CGI程序(apache是fork进程exec CGI程序);
2、Web服务器通过环境变量和标准输入把请求信息传递给CGI程序;
3、CGI程序执行业务逻辑后,通过标准输出和标准错误把响应数据返回给Web服务器,CGI程序exit;
4、Web服务器再组织成HTTP响应包发给浏览器。
在上面的例子中,第一行printf是输出HTTP头(还记得HTTP Header和Body是用\r\n\r\n分割的么?),getenv("QUERY_STRING")是从环境变量获取URL,printf是通过标准输出返回内容。
Web服务器会把哪些信息通过环境变量传递给CGI程序?常用的有这些:
- CONTENT_LENGTH :向标准输入发送的数据的字节数(POST)
- QUERY_STRING:实际存放发送给CGI程序的数据(GET)
- REQUEST_METHOD:传送数据所用的CGI方法(GET或POST)
- HTTP_COOKIE:cookie值
- REMOTE_ADDR:用户IP
- SCRIPT_NAME:请求的CGI
可以看到CGI只是一种标准,可以用任何一种语言编写CGI程序,只要这种语言具有标准输入、标准输出和环境变量,比如:C/C++,perl,PHP、ruby。按照CGI标准要求,就能和Web服务器交互起来。
FastCGI应运而生
CGI是通过环境变量/标准输入、标准输出/标准错误来传输数据,运行性能比较低,主要有两点:
1、每个请求都需要Web服务器去fork出CGI程序,频繁fork进程比较耗时
2、CGI程序每次都是从头运行,读配置、连接其他服务都得重新来,也比较耗时
FastCGI是对CGI的改进,FastCGI模式下,Web服务器和FastCGI程序传输数据的过程大体是:
1、Web服务器收到的请求信息后,按FastCGI协议把请求信息通过socket发给FastCGI程序;
2、FastCGI程序执行业务逻辑后,通过socket把响应数据返回给Web服务器,FastCGI程序不exit;
3、Web服务器再组织成HTTP响应包发给浏览器。
对比CGI的通过,可以发现主要是少了每次fork的过程,并且用socket来传输数据,这是FastCGI接口更高效的原因。
FastCGI有这些特点:
- FastCGI程序常驻内存,启动后可以反复处理请求
- FastCGI 就是进程池/线程池模型的通用同步服务器框架
FastCGI程序处理请求后不会退出,可以反复处理请求,那么在启动后就把配置解析、与其他后台的连接建立好,不用每次请求时搞一边,自然更快了。
至于这个FastCGI内部如何实现进城池/线程池,就是FastCGI进程管理器(FastCGI引擎)的事情了。C/C++ FastCGI常用apache的mod_fastcgi模块,PHP常用spawn-fcgi和PHP-FPM。
相关推荐
1. 进程管理:CGI每次请求都会启动新的进程,而FastCGI则重用已存在的进程。 2. 性能:由于FastCGI避免了频繁创建和销毁进程,因此在高并发情况下,其性能优于CGI。 3. 资源利用率:FastCGI更节省系统资源,因为它...
Java的FastCGI网关jFastCGI是一个用于在Java应用程序服务器和FastCGI服务器之间建立连接的开源库。FastCGI是一种常驻型(long-lived)的协议,旨在提高Web服务器性能,尤其是在处理动态内容时。它允许Web服务器将...
FastCGI是CGI的扩展,像是一个常驻型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这就是CGI最为人诟病的fork-and-execute模式)。FastCGI支持分布式的运算,即FastCGI程序可以在网站...
kcgi, 用于 C/C 的最小CGI和FastCGI库 概要kcgi是用于 C/C 网络应用程序的开源CGI和FastCGI库。 它最小。安全和审计;并且适合于你的 BCHS软件栈。这里存储库包含版本之间的边缘代码: 要保持最新版本的kcgi,请访问...
步骤 6:配置 IIS 右键单击“网站”,选择“属性”,单击“主目录”选项,点击“配置”按钮,单击“添加”按钮,选择 FastCGI 扩展,并将扩展名设置为 .php。 步骤 7:测试 PHP FastCGI 创建 test.php 文件,并...
- **对比CGI**:CGI每次请求都会启动新的进程,处理完请求就结束,而FastCGI进程是长期存在的。 - **对比SSI**(Server Side Includes):SSI适用于简单的动态内容插入,而FastCGI适合处理复杂的动态页面生成。 -...
**kcgi:C++的最小CGI和FastCGI库** `kcgi`是一个轻量级、高效的C++库,专为实现CGI(通用网关接口)和FastCGI协议而设计。它旨在提供一个简洁、易于理解和使用的API,以便开发者能够快速构建Web应用程序。在本文中...
在本文中,我们将详细讨论FastCGI以及如何在IIS6上安装和使用FastCGI 1.5的32位和64位版本。 **FastCGI工作原理** FastCGI的工作方式是通过一个常驻进程来处理来自Web服务器的请求。当Web服务器接收到HTTP请求时,...
6. **启动和测试**:使用创建的服务脚本启动FastCGI进程,并通过访问Web服务器上的一个PHP或其他动态语言文件来测试配置是否成功。 7. **优化和安全**:根据服务器负载和安全需求,可能需要调整FastCGI进程的数量、...
FastCGI的核心设计目标是避免传统CGI模式下频繁启动和关闭进程带来的开销,通过保持进程的持久连接来提高效率。 **FastCGI工作原理** FastCGI在Web服务器和应用服务器之间建立持久的连接,当请求到来时,Web服务器...
6. **跨平台**:作为Nim库,`fastcgi.nim`可以编译成多种平台的目标代码,如Linux、macOS、Windows等。 **应用场景** - **动态内容生成**:用于处理动态网页请求,如PHP脚本通常通过FastCGI与Apache或Nginx交互。 ...
一文读懂cgi、fastcgi、php-cgi、php-fpm的区别CGI诞生之前CGI的诞生CGI程序如何工作Web服务器的内置模块FastCGIphp-fpmphp-cgiphp-cgi与php-fpm的区别 CGI诞生之前 在CGI诞生之前Web服务器负责静态文件的存储、查找...
在centos上成功编译安装nginx 1.4、php 5.4并成功启动nginx和php-fpm后,访问php提示”File not found.”,同时在错误日志中看到: 代码如下:2013/10/22 20:05:49 [error] 12691#0: *6 FastCGI sent in stderr: ...
3. **CGI程序处理**:CGI程序解析请求参数,执行相应的业务逻辑。 4. **生成响应**:CGI程序根据处理结果生成HTML或其他格式的数据。 5. **返回给Web服务器**:CGI程序将生成的响应内容返回给Web服务器。 6. **Web...
FastCGI作为一种高性能的网络应用程序接口,解决了传统CGI存在的性能瓶颈问题,并提供了更好的伸缩性和高可用性支持。通过对FastCGI的工作原理、协议细节及其应用场景的深入理解,开发者可以更高效地利用这一工具,...
与传统CGI不同,FastCGI进程在接收到请求时不会反复启动和关闭,而是持续存在于内存中,这显著减少了初始化开销。因此,对于高流量的网站,FastCGI能够提供更好的响应时间和更高的并发处理能力。 FastCGI的优点包括...
### FastCGI手册知识点解析 #### 一、FastCGI技术概述 ...通过以上步骤,可以在Apache服务器上成功安装并配置FastCGI模块,从而实现对FastCGI技术的支持,进而提高Web应用程序的性能和响应速度。
- 程序采用FastCGI方式运行PHP,而`StartProcesses`设置过大(例如设置为6或更高),导致创建过多的`php-cgi.exe`进程。 - 系统临时文件过多,尤其是MySQL数据库的临时文件默认存储位置可能导致磁盘空间不足,进而...
- **文件句柄**:CGI程序可以使用`freopen()`重定向`stdin`、`stdout`和`stderr`到服务器指定的临时文件,以便于与Web服务器通信。 4. **编译与调试**:在VC中编译生成CGI程序,并将其部署到Web服务器的CGI目录下。...