关于CGI:Tomcat、PHP、Perl、Python和FastCGI之间的关系
如前文所述,Web服务器是一个很简单的东西,并不负责动态网页的构建,只能转发静态网页。同时Apache也说,他能支持perl,生成动态网页。这个支持perl,其实是apache越位了,做了一件额外的事情。
现在我们看生成动态网页这件事情。
CGI的定义是:外部应用程序与Web服务器之间的接口。
明白了吧?也就是说,所谓的动态网页,都是要外部应用程序生成的,而不是Web服务器能干的事情。所以,最初的、最简单的CGI,是使用C来写的,很简单。
到了后来,大家觉得老用C也不是个办法啊,效率这么慢,老板逼得紧,天天加班不是个事,于是PHP、ASP、Java、Perl、Python这些高级语言就掺合进来了。
其中,ASP由于是微软一家单独支撑,不开源,还要买他那么贵的服务器软件,开发者就不想用了,越来越没落。
用Java语言来写CGI,就是JSP技术
PHP的正名为:超文本预处理语言。从这个名字可以看出,就是专门为动态网页而生的,它的好处是可以潜入HTML,而不是像C那样重新生成整个文本。这个现在已经不是优势了,JSP一样可以做到这点。PHP由于是动态加载,边解释边执行,所以效率没有java高,这个问题可以用预编译和使用C、C++模块来解决。
这些语言里面,Java的发展是最迅速的,所以Java产生了一堆好东西,比如Tomcat,比如IBM的Websphere,WebSphere是真正的应用服务器,而Tomcat还算不上,因为他还不能真正支持很多J2EE的API,但是Tomcat作为servlet的容器,基本满足写CGI的需求,这样使得Tomcat被使用得非常广泛。
Tomcat是apache的一个子项目,它也不务正业,也支持做web服务器的功能,这是很搞笑的,你一个动态网页处理容器,干嘛要做web服务器呢?这让我想到做产品时产品经理的贪嗔痴。但Tomcat全部使用java完成,并且,他是单进程结构,是使用CPU密集型的架构来设计的,而上篇文章讲到web服务器其实是IO密集型的,这样Tomcat在处理大规模的Web请求时,根本没法玩。所以很多人说,使用apache处理静态网页,使用tomcat处理动态网页。
除了Java有Tomcat作为容器来进行支撑外,其他的CGI就很土了,都是脚本,一是需要边解释边执行,二是都是一锤子买卖,一锤子买卖的意思是,这些个脚本的CGI,都是使用其解释器+CGI部分合成一个CGI程序,apache接收到请求后,就启动一个CGI程序,生成动态内容后,CGI程序退出。这种方式也太土鳖了,让我这种长期习惯于windows编程的人非常鄙视。
这种方式显然是不行的,效率非常低,所以,fastCGI就出来了,fastCGI在CGI和web服务器中间再加了一层。
fastCGI用来管理多个CGI进程,它负责同时生成和回收多个CGI进程,以服务器的内存空间,换取处理时间。
一个不相关的感想:不论CGI怎么变,fastCGI可以以不变应万变,如果把网页的请求过程看成产业链,fastCGI无疑是一个非常好的切入点,可以经久不衰,并且以不变应万变。
经过fastCGI优化之后,从效率上讲,PHP等脚本语言与java只差一点了,这点就是解释执行,所以php需要预编译,进行代码缓存之后,效率应该可以接近jsp。
另外一个问题是,nginx以减少进程的方式革了apache的命,会不会有新的程序,以nginx的方式,来革fastCGI的命呢?
关于CGI:Tomcat、PHP、Perl、Python和FastCGI之间的关系的更多相关文章
- Python面向对象(类之间的关系)(三)
类与类之间的关系 在我们的世界中事物和事物之间总会有一些联系. 在面向对象中. 类和类之间也可以产生相关的关系 1. 依赖关系 执行某个动作的时候. 需要xxx来帮助你完成这个操作. 此时的关系是最轻 ...
- CGI、FastCGI和PHP-FPM关系图解
CGI.FastCGI和PHP-FPM关系图解 webapp即是php解析器等 当Web Server收到 index.php 这个请求后,会启动对应的 CGI 程序,这里就是PHP的解析器.接下 ...
- shell,perl,python的区别
shell+sed+awk严格的讲, shell不是一种编程语言, 但是shell有自己的控制流结构(判断,循环,选择),运算以及函数等编程语言特性, 加上shell命令组织在一起构成脚本, 能够完成 ...
- php CGI、Fastcgi、PHP-FPM的详细介绍与之间的关系
以下PHP CGI.Fastcgi.PHP-FPM的一些信息归纳和汇总----->详细介绍与之间的关系 一:CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的 web ...
- awk,perl,python的命令行参数处理
Python,Perl,Bash命令行参数 Part I 日常经常性的和Perl,Python,Bash打交道,但是又经常性的搞混他们之间,在命令行上的特殊性和index的区别,Python真的是人性 ...
- split function of Perl,Python,Awk
使用中常用到Perl,Python,AWK,R, 虽然Java,C,C++,Vala也学过但是就是不喜欢,你说怎么办. 看来一辈子脚本的命. Perl @rray = split /PATTERN/, ...
- 正则表达式-使用说明Regular Expression How To (Perl, Python, etc)
notepad++ wiki about regular expression 正则表达式-使用说明Regular Expression How To (Perl, Python, etc) http ...
- nginx tomcat 自动部署python脚本【转】
#!/usr/bin/env python #--coding:utf8-- import sys,subprocess,os,datetime,paramiko,re local_path='/ho ...
- RHEL / CentOS Linux Install Core Development Tools Automake, Gcc (C/C++), Perl, Python & Debuggers
how do I install all developer tools such as GNU GCC C/C++ compilers, make and others, after install ...
随机推荐
- Hibernate 集合映射 一对多多对一 inverse属性 + cascade级联属性 多对多 一对一 关系映射
1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; privat ...
- 【SqlServer系列】表连接
1 概述 1.1 已发布[SqlServer系列]文章 [SqlServer系列]MYSQL安装教程 [SqlServer系列]数据库三大范式 [SqlServer系列]表单查询 1.2 本篇 ...
- 微信iOS消息拦截插件教程-Tweak HelloWorld
微信iOS消息拦截插件教程-Tweak HelloWorld 标签(空格分隔): 越狱开发教程 1.环境准备 准备一台越狱的手机,具体参照上一篇教程 搭建Theos越狱开发环境 2.开发过程 新建一个 ...
- mysql5.7 date类型无法设置'0000-00-00'默认值
现象: mysql5.7之后版本datetime默认值设置'0000-00-00',出现异常:Invalid default value for 'create_time' 原因: mysql5.7之 ...
- STL—list
前面我们分析了vector,这篇介绍STL中另一个重要的容器list list的设计 list由三部分构成:list节点.list迭代器.list本身 list节点 list是一个双向链表,所以其li ...
- LoadRunner接口测试Error -27225报错解决
今天依照规范写了一个接口测试脚本,再执行的时候报Error -27225,核对了接口字段和字段值没发现错误,百度搜Error -27225错误没有相关解释.这个问题经过溯源找到了问题的所在,为了互帮互 ...
- if __name__ == '__main__' 如何正确理解
今天有个初学Python 的朋友问我这个问题,他说在网上好多回答他都不太理解.所以这里我来做说一下,希望能把这个问题说明白. 先举一个例子:假设我们有一个add.py文件,里面的代码是这样: def ...
- (转)IBM MQ 创建以及常见问题集锦
背景:这篇文章还是很全面的,但是很杂乱 后面慢慢整理吧! 1 MQ 消息队列+发送队列+消息通道 接收通道名称与发送端的发送通道名称要一致,修改通道信息后要执行 start channle(chlna ...
- 【Owin 学习系列】2. Owin Startup 类解析
Owin Startup 类解析 每个 Owin 程序都有 startup 类,在这个 startup 类里面你可以指定应用程序管道模型中的组件.你可以通过不同的方式来连接你的 startup 类和运 ...
- hash冲突随笔
一:hash表 也叫散列表,以key-value的形式存储数据,就是将需要存储的关键码值通过hash函数映射到表中的位置,可加快访问速度. 二:hash冲突 如果两个相同的关键码值通过hash函数映射 ...