CGI和动态请求是什么?web server和CGI各种术语及交互模式解读(1)

时间:2018-07-31 作者:佚名 编辑:xiaoxin 来源:不甘平庸网

1. CGI是什么

CGI是common gateway interface的缩写,大家都译作通用网关接口,但很不幸,我们无法见名知意。

我们知道,web服务器所处理的内容都是静态的,要想处理动态内容,需要依赖于web应用程序,如php、jsp、python、perl等。但是web server如何将动态的请求传递给这些应用程序?它所依赖的就是cgi协议。没错,是协议,也就是web server和web应用程序交流时的规范。换句话说,通过cgi协议,再结合已搭建好的web应用程序,就可以让web server也能"处理"动态请求(或者说,当用户访问某个特定资源时,可以触发执行某个web应用程序来实现特定功能),你肯定知道处理两字为什么要加上双引号。

CGI和动态请求是什么?web server和CGI各种术语及交互模式解读

简单版的cgi工作方式如下:

例如,在谷歌搜索栏中搜索一个关键词"http",对应的URL为:

https://www.google.com/search?q=http&oq=http&aqs=chrome..69i57j69i60l4j0.1136j0j8&sourceid=chrome&ie=UTF-8

当谷歌的web server收到该请求后,先分析该url,从中知道了要执行search程序,并且还知道了一系列要传递给search的参数及其对应的value。web server会将这些程序参数和其它一些环境变量根据cgi协议通过TCP或套接字等方式传递给已启动的cgi程序(可能是cgi进程,或者是已加载的模块cgi模块)。当cgi进程接收到web server的请求后,调用search程序并执行,同时还会传递参数给search程序。search执行结束后,cgi进程/线程将处理结果返回给web server,web server再返回给浏览器。

有多种方式可以执行cgi程序,但对http的请求方法来说,只有get和post两种方法允许执行cgi脚本(即上面的search程序)。实际上post方法的内部本质还是get方法,只不过在发送http请求时,get和post方法对url中的参数处理方式不一样而已。

任何一种语言都能编写CGI,只不过有些语言比较擅长,有些语言则非常繁琐,例如用bash shell开发,那么需要用echo等打印语句将执行结果放在巨多无比的html的标签中输出给客户端。常用于编写CGI的语言有perl、php、python等,java也一样能写,但java的servlet完全能实现CGI的功能,且更优化、更利于开发。

2.各种术语释疑

说实话,对于一个没接触过编程语言的人来说,刚接触cgi概念的时候肯定会有一堆疑问,这到底是什么鬼,处理动态内容的东西不是像php一样的应用程序吗,跟cgi有几毛钱关系,fastcgi又是什么?我想,非科班出身的强迫症患者(包括我)一定会被这些概念折腾的死去活来。

以php为例,我将一次动态请求相关的概念大致都简单解释一遍。

cgi:它是一种协议。通过cgi协议,web server可以将动态请求和相关参数发送给专门处理动态内容的应用程序。

fastcgi:也是一种协议,只不过是cgi的优化版。cgi的性能较烂,fastcgi则在其基础上进行了改进。

php-cgi:fastcgi是一种协议,而php-cgi实现了这种协议。不过这种实现比较烂。它是单进程的,一个进程处理一个请求,处理结束后进程就销毁。

php-fmp:是对php-cgi的改进版,它直接管理多个php-cgi进程/线程。也就是说,php-fpm是php-cgi的进程管理器因此它也算是fastcgi协议的实现。在一定程度上讲,php-fpm与php的关系,和tomcat对java的关系是类似的。

cgi进程/线程:在php上,就是php-cgi进程/线程。专门用于接收web server的动态请求,调用并初始化zend虚拟机。

cgi脚本:被执行的php源代码文件。

zend虚拟机:对php文件做词法分析、语法分析、编译成opcode,并执行。最后关闭zend虚拟机。

cgi进程/线程和zend虚拟机的关系:cgi进程调用并初始化zend虚拟机的各种环境。

以php-fpm为例,web server从转发动态请求到结束的过程大致如下:

CGI和动态请求是什么?web server和CGI各种术语及交互模式解读

而每个php-cgi进程的作用大致包括:(有些功能分类错误,请无视,知道大致功能就够了)

CGI和动态请求是什么?web server和CGI各种术语及交互模式解读

注意,尽管php-fpm的全称为PHP FastCGI Process Manager,但严格地讲,php-fpm不是fastcgi的进程管理器,而是php fastcgi即php-cgi的进程管理器。fastcgi只是一种协议,不是进程。就像http协议一样,apache对它的实现是httpd,nginx对它的实现就叫nginx。

再次说明,cgi和fastcgi是一种协议。各种支持和WEB交互的编程语言对cgi/fastcgi协议都做了各自的实现(当然,任何一种语言都能写cgi脚本),而php上的php-cgi和php-fpm正是php对fastcgi协议的实现。

相关阅读
  • PHP解决如抢购并发问题的几种实现方法
    PHP解决如抢购并发问题的几种实现方法
    对于商品抢购等并发场景下,可能会出现超卖的现象,这时就需要解决并发所带来的这些问题了在PHP语言中并没有原生的提供并发的解决方案,因此就需要借助其他方式来实现并发... [详情]
  • php中session引起的脚本阻塞问题解决办法
    这个问题很多做php开发朋友应该都有遇到过,一个启用了session_start 页面,由于执行时间过长。导致通一个用户访问,另外一个很简单的启用session_start页面一直阻塞着。 直到第一个页面执行完了。第二个页面才可以... [详情]
  • PHP正则替换函数preg_replace和preg_replace_callback使用总结
    在编写PHP模板引擎工具类时,以前常用的一个正则替换函数为 preg_replace(),加上正则修饰符 /e,就能够执行强大的回调函数,实现模板引擎编译(其实就是字符串替换)。... [详情]
  • php上传文件大小限制问题解决方法:post_max_size对大小的影响
    今天在操作php上传的时候发现了一个问题,就是当php脚步上传的文件大小超过php.ini中post_max_size的限制的时候页面不会给出提醒,文件也上传失败,这个问题感觉应该算是一个另类,今天跟大家分享一下。... [详情]
  • php中的filesize读取图片大小代码实例
    filesize() 函数返回指定文件的大小。 若成功,则返回文件大小的字节数。若失败,则返回 false 并生成一条 E_WARNING 级的错误。本文为你详解php如何读取图片详细信息。... [详情]
  • php用Imagick模块完美实现GIF动画缩略图代码实例
    php用Imagick模块完美实现GIF动画缩略图代码实例
    缩略图是个很常用的功能。它的实现并不复杂,但如果原图是GIF动画的话,问题就会变得繁琐一点。下面看看如何用PHP中的Imagick模块来完美实现GIF动画缩略图……... [详情]
  • PHP怎样判断一个gif图片是否为动态图片(动画)?
    如何使用PHP来判断一个gif图片是否为动态图片(动画)?首先想到的是使用getimagesize()函数来看type值,发现都是gif,所以这个办法是不可行的。下面是作者在网上看到的一个函数,经测试,可以用来判断gif是否为动图。... [详情]
  • Linux和windows7下安装php的imagick和imagemagick扩展教程
    最近的PHP项目中,需要用到切图和缩图的效果,在Linux测试服务器上很轻松的就安装好php imagick扩展。但是在本地windows开发环境,安装过程遇到好多问题,在此与大家分享。... [详情]
  • php服务器500错误无输出,快速定位错误代码万能调试方法
    网站线下调试没有问题,放到线上报500错误,无输出,无报错,日志正常,如何才能快速定位错误代码?经过网上搜索,找到一种方法:万能调试代码法,问题得到解决。... [详情]
  • php使用fsockopen读取分段数据出现多余字符的解决方法
    使用fsockopen读取数据时遇到了一个神奇的问题,具体情况如下:请注意上面那些标红的4个字符,它们每隔一段数据就会出现一次,但是用其他的方法如curl,file_get_contents等取回的数据则没有这些玩意。换成其他的网站... [详情]
  • php去掉fsockopen返回结果中的HTTP头信息的方法
    去掉fsockopen返回结果中的HTTP头信息的两种方法:1、【使用split或substr,strpos截断】在返回的内容中HTTP头信息与正文内容是以两个“换行回车”隔开的所以我们可以在此截断,取之后的内容。2、【先取Content-Length... [详情]
  • PHP环境下Memcache的使用方法详解
    Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在... [详情]
  • php在用file_get_contents抓取网页时出现乱码的2种解决方式
    今天自己在写一个程序,抓取别人的网页,之前公司有些功能也会需要,但是今天在抓取网页的时候发现了一个问题用file_get_contents抓取网页发现乱码情况。于是用转换编码$contents = iconv("gb2312", "utf-8//IGNORE... [详情]
  • php iconv函数在gb232与utf-8之间转码时出错断掉的解决方法
    最近在做一个采集程序,需要用到iconv函数把抓取来过的gb2312编码的页面转成utf-8, 发现只有用iconv函数把抓取过来的数据一转码数据就会无缘无故的少一部分。让我郁闷了好一会儿,去网上一查资料才知道这是iconv函... [详情]
  • php操作excel的类:PHPExcel 1.8.0使用方法
    首先到phpexcel官网上下载最新的phpexcel类,下载解压缩一个classes文件夹,里面包含了PHPExcel.php和PHPExcel的文件夹,这个类文件和文件夹是我们需要的,把classes解压到你项目的一个目录中,重名名为phpexcel,代... [详情]
  • PHP字符串定义的几种方式
    如果遇到需要多行书写的字符串怎么办,比如我们要定义一段JS脚本,当然如果把脚本写在一行里是没问题的,但是如果脚本比较长一些,而且其中会出现很多转义符号的话,脚本最终成型的话,很有可能成了一锅黏粥了。不但... [详情]
  • PHP匿名函数详解
    PHP匿名函数 匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)的参数。 当然,也有其他应用的情况。... [详情]
  • php cli模式传递和获取参数的方法
    php cli模式传递和获取参数的方法
    在命令行里输入程序参数来更改其运行方式是很常见的做法。你也可以对CLI程序这样做。PHP CLI带有两个特殊的变量,专门用来达到这个。目的:一个是$argv变量,它通过命令行... [详情]
  • php通过QRCode类库创建中间带网站LOGO的二维码实例
    我们要生成二维码都需要借助一些类库来实现了,下面我介绍利用PHP QR Code生成二维码吧,生成方法很简单,下面我来介绍一下.利用php类库PHP QR Code来实现,不需要装额外的php扩展,首先下载类库包,有时候地址打不开,地址... [详情]
  • php详解session_id()应在session_start()前还是后?
    大家通过手册可以知道session的恢复通过session_id($id);但是在恢复时要注意一个先后顺序,要得到之前session的内容,必须在session_start()之前执行session_id($id),这样才能在执行了session_start时初始化session... [详情]
  • PHP心得推荐
    • linux定时计划任务crontab命令详解
      crontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果... [详情]
    • PHP解决如抢购并发问题的几种实现方法
      PHP解决如抢购并发问题的几种实现方法
      对于商品抢购等并发场景下,可能会出现超卖的现象,这时就需要解决并发所带来的这些问题了在PHP语言中并没有原生的提供并发的解决方案,因此就需要借助其他方式来实现并发... [详情]
    • php用Imagick模块完美实现GIF动画缩略图代码实例
      php用Imagick模块完美实现GIF动画缩略图代码实例
      缩略图是个很常用的功能。它的实现并不复杂,但如果原图是GIF动画的话,问题就会变得繁琐一点。下面看看如何用PHP中的Imagick模块来完美实现GIF动画缩略图……... [详情]
    • php cli模式传递和获取参数的方法
      php cli模式传递和获取参数的方法
      在命令行里输入程序参数来更改其运行方式是很常见的做法。你也可以对CLI程序这样做。PHP CLI带有两个特殊的变量,专门用来达到这个。目的:一个是$argv变量,它通过命令行... [详情]
    • PHP 之父:PHP7 性能翻倍关键大揭露
      PHP 之父:PHP7 性能翻倍关键大揭露
      20岁老牌网页程序语言PHP,将在10月底释出PHP 7新版,这是十年来的首次大改版,最大特色是在性能上的大突破,能比前一版PHP 5快上一倍,PHP之父Rasmus Lerdorf表示,甚至能... [详情]
    • PHP开发常用数组函数
      PHP开发常用数组函数,记录下方便查看: [详情]
    • 用PHP正则表达式清除字符串的空白
      我们经常会处理来自用户输入或从数据库中读取的数据,可能在你的字符串中有多余的空白或制表符,回车等。存储这些额外的字符是有点浪费空间的。... [详情]
    • php include加载或查找文件的先后顺序
      include第一次找到某文件后,会缓存结果。下一次include相同的路径时,只取缓存结果而不会多重查找,这就导致了我们移除某文件后可能短暂的时间内include会报错(因为include机制发现缓存结果的路径不存在,不会往下... [详情]
    频道推荐
    本周推荐
    点击排行