关于cgi和fastcgi的几点认识

本文详细介绍了CGI和FastCGI的概念、用途、运行模式及其改进方案,旨在帮助开发者提升网站性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于cgi和fastcgi的几点认识
2008-12-09 0:31

经过两天的学习吧,终于有点清楚了cgi和fastcgi是干吗的了!

1.cgi是Web服务器和外部程序的沟通桥梁?这个“其他程序”可以使用任何计算机语言来编写,它通过CGI这个接口从HTTP服务器取得输入,然后把运行的结果又通过CGI这个接口交给HTTP服务器,而HTTP服务器把这个结果送给浏览器。

2.cgi具体能干什么?就是在最初开始有网站的时候,那时候的页面全是以html语言写的,后来出现了CGI,网站不在有固定不变的图形和文字了.CGI可以写小从简单的网页计数器,留言版,大至搜索引擎,可做线上实时交易的电子商务,网络下单,评论等功能.

3.cgi的运行模式为fork-and-execute 模式,CGI的程序每次执行时都要花费时间去复制一个新的进程,这会占用过多的资源。如果有大量的request,那么服务器反应会变的很慢.随着网站使用量的日增,会大大的影响网站的效率.

为了克服cgi的瓶颈,提出了一些解决之道.

NSAPI,应用在unix系统上,用NSAPI改写网站应用程序最麻烦的是你要把所有程序编译成动态函式库 (share library),以供 Enterprise Server 在 run-time 时期可以动态呼叫这些程序。由于利用 NSAPI 所写的程序是直接从 Web Server 的执行空间内被呼叫,所以速度最快,但是程序必须遵循 Enterprise Server 的撰写规则,而且一旦程序发生错误,Web Server 也会受影响.

IISAPI,相较于NSAPI,在Microsoft NT IIS (Internet Information Server) 平台就是ISAPI了.类似NSAPI,利用ISAPI撰写网站应用程序,必须把应用程序编译成动态函式库,也就是DLL.它的执行速度也很快,但要遵循ISAPI的撰写规则和数据结构,程序发生错误时也会影响 IIS Server 的正常运作.而且应用平台只是Microsoft NT.

荐于以上解决之到的应用特定平台和固定的缺点,fastcgi应运而生.

不同于NSAPI及ISAPI以及其它的网页服务器语言(如 ASP, PHP3, mod_perl),FastCGI比较类似 CGI,它只是一个网站应用程序设计的规格,因此先天上不受任何网站服务器平台,操作系统平台,以及开发语言的限制,但又能大幅改善CGI效率不良的问题.FastCGI的特色如下:

1. FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去,fork,一次(这是CGI最为人诟病的fork-and-execute模式). 
2. FastCGI可在任何平台上使用,Netscape Enterprise及IIS都有FastCGI的模块可供使用,Apache上也有mod_fastcgi可用. 
3. FastCGI支持C/C++,Perl,Tcl,Java,Python等程序语言. 
4. FastCGI的应用程序亦兼容于CGI.即FastCGI的应用程序也可以当成CGI来执行. 
5. 现有的CGI程序要改写成FastCGI非常简单,最少可能只需要多加入三行程序代码. 
6. FastCGI的侦错方式与 CGI 大同小异,只要带入程序所需的环境变量及参数,即可在命令列模式执行或侦错. 
7. FastCGI应用程序的写作方式与 CGI类似,除了几项原则要特别注意外,FastCGI的写作方式跟CGI几乎一样,与学习 Web Server API比较起来,FastCGI 简单多了. 
8. FastCGI支授分布式运算(distributed computing),即FastCGI程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求.


<think>好的,用户现在想了解CGIFastCGI之间的区别,特别是与PHP的实现相关的部分。根据用户之前的问题,他们已经了解过PHP的FastCGIFPM,现在可能想深入理解这两种协议在PHP环境中的具体差异。 首先,我需要回顾用户提供的引用内容,这些引用涵盖了CGIFastCGI以及PHP相关实现的信息。引用[2]提到PHP-CGI是PHP自带的FastCGI管理器,但存在配置变更后需要重启的问题,而PHP-FPMSpawn-FCGI可以平滑重启。引用[3]讨论了CGIFastCGI在安全性资源管理上的不同。引用[4][5]则解释了Apache中mod_php、mod_cgimod_fastcgi的工作方式,以及各自的优缺点。 接下来,我需要整理CGIFastCGI的核心区别,特别是针对PHP的情况。用户可能关心性能、资源管理、配置灵活性等方面。需要强调FastCGI如何改进CGI的不足,比如进程持久化、减少开销等。同时,结合PHP的具体实现,比如PHP-CGIPHP-FPM的对比,说明FastCGI在PHP中的优化。 要注意用户可能存在的潜在问题,比如为什么PHP-FPM比PHP-CGI更好,或者在高并发环境下FastCGI的优势。此外,用户可能对如何选择不同的配置方式(如mod_php vs FastCGI)感兴趣,需要简要提及这些内容,但重点还是放在CGIFastCGI的区别上。 需要确保回答结构清晰,分点说明,涵盖工作原理、性能、资源使用、配置管理PHP相关实现等方面。同时,要引用提供的资料来支持每个观点,例如引用[2]中提到的PHP-CGI的不足,以及引用[5]中mod_php的缺点。 最后,生成的相关问题需要围绕PHP实现实际应用场景,帮助用户进一步理解如何应用这些知识,比如优化PHP-FPM配置或排查相关问题。</think>### CGI vs FastCGI 核心区别(基于PHP实现) --- #### **1. 基础定义** - **CGI(通用网关接口)** 是一种**协议标准**,用于Web服务器与外部程序(如PHP脚本)通信。每次请求都会**新建进程**处理,完成后立即销毁。 *PHP实现示例*:Apache的`mod_cgi`模块通过调用`php-cgi`解释器执行脚本[^5]。 - **FastCGI(快速通用网关接口)** 是CGI的**改进协议**,通过**持久化进程**处理多个请求,减少重复创建进程的开销。 *PHP实现示例*:PHP-FPM(FastCGI进程管理器)或`mod_fastcgi`(Apache模块)[^1][^4]。 --- #### **2. 核心差异** | **对比维度** | **CGI** | **FastCGI** | **PHP实现关联** | |--------------------|--------------------------------------|--------------------------------------|------------------------------------| | **进程管理** | 每次请求新建/销毁进程 | 持久化进程池处理多个请求 | PHP-FPM动态管理`php-cgi`子进程[^2] | | **性能开销** | 高(频繁进程创建) | 低(进程复用) | 支持高并发,减少内存碎片[^3] | | **配置灵活性** | 修改配置需重启Web服务器 | 支持热更新(如`php-fpm reload`) | PHP-FPM可平滑加载新php.ini[^2] | | **安全性** | 进程隔离性差(依赖Web服务器) | 进程独立运行,隔离性更强 | 避免PHP脚本跨域污染 | | **资源占用** | 单次请求内存释放彻底 | 常驻进程占用固定内存 | 需合理配置PHP-FPM进程数[^4] | --- #### **3. PHP实现中的典型问题** - **CGI模式(如`php-cgi`)** - 修改`php.ini`后必须重启进程,导致服务中断[^2]。 - 高并发时频繁创建进程,易引发服务器崩溃(如Apache的`mod_cgi`)[^5]。 - **FastCGI模式(如PHP-FPM)** - 进程池长期占用内存,需根据服务器配置调整`pm.max_children`参数[^4]。 - 与Nginx/Apache通信时需选择`Unix Socket`(高效)或`TCP`(跨服务器)[^1][^4]。 --- #### **4. 工作流程对比** **CGI流程** ```plaintext 用户请求 → Web服务器新建进程 → 调用php-cgi → 处理请求 → 销毁进程 ``` *缺点*:每次请求约需10-100ms进程创建时间[^3]。 **FastCGI流程** ```plaintext 用户请求 → Web服务器转发请求 → PHP-FPM分配空闲进程 → 处理并返回结果 → 进程复用 ``` *优势*:处理时间降低至1-5ms(无进程创建开销)[^3]。 --- #### **5. PHP场景下的选择建议** - **使用CGI的场景** - 开发调试(进程隔离便于排查错误)[^3] - 低流量场景(如小型静态网站) - **使用FastCGI的场景** - 生产环境高并发(如电商、社交平台) - 需动态扩展资源(PHP-FPM支持按需增减进程)[^2] - 要求配置热更新(如频繁调整`php.ini`)[^5] --- #### **6. 性能优化示例(PHP-FPM配置)** ```conf ; php-fpm.conf pm = dynamic pm.max_children = 50 pm.start_servers = 10 pm.min_spare_servers = 5 pm.max_spare_servers = 20 ``` *说明*:动态进程池根据负载自动调整,避免内存浪费[^4]。 --- ### 总结 CGI是“一次一销毁”的原始协议,而FastCGI通过**进程持久化****资源复用**显著提升PHP性能。在PHP中,**PHP-FPM**作为FastCGI的进程管理器,解决了传统CGI的配置僵化性能瓶颈,成为现代PHP应用的主流部署方案。 --- **相关问题**: 1. 如何监控PHP-FPM的进程状态以优化资源配置? 2. 在Apache中如何配置`mod_fastcgi`替代`mod_php`? 3. 为什么PHP-FPM的`static``dynamic`进程管理模式适用不同场景?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值