CGI C编程

来源:互联网 发布:phxsql mysql 5.7 编辑:程序博客网 时间:2024/06/06 03:55

CGI(common gateway interface)通用网关接口。CGI程序是指运行在web服务器上的程序,一般用来完成web网页中的表单处理,数据库查询与传统应用系统集成等工作。

举个例子来说明CGI程序到底是干嘛用的,当你在某网站注册用户的时候,你需要填写一系列的表单,当你点击提交,前端需要将你的用户名,密码等信息提交给server,server会查询数据库是否重名以及做各种检测工作,然后返还一个注册成功或者失败的消息给你。通过CGI程序你就能接受web前端提交的信息,并做相应的处理,然后将结果返还给前端。以上就是CGI程序通常所做的工作。

它是如何实现的呢??<from name="ace's from" action="http://www.ace.com/cgi-bin/ace.cgi" method=GET>如果你想传递一些参数给CGI程序呢?<from name="ace's from" action="http://www.ace.com/cgi-bin/ace.cgi?arg1+arg2+arg3" method=GET>只需在路径后加?再加上参数即可,参数之间用+隔开。

我在这里先列一下CGI的环境变量:

CGI 环境变量

环境变量 
意义

SERVER_NAME 
CGI脚本运行时的主机名和IP地址.

SERVER_SOFTWARE 
你的服务器的类型如: CERN/3.0 或 NCSA/1.3.

GATEWAY_INTERFACE 
运行的CGI版本. 对于UNIX服务器, 这是CGI/1.1.

SERVER_PROTOCOL 
服务器运行的HTTP协议. 这里当是HTTP/1.0.

SERVER_PORT 
服务器运行的TCP口,通常Web服务器是80.

REQUEST_METHOD 
POST 或 GET, 取决于你的表单是怎样递交的.

HTTP_ACCEPT  
浏览器能直接接收的Content-types, 可以有HTTP Accept header定义.

HTTP_USER_AGENT 
递交表单的浏览器的名称、版本 和其他平台性的附加信息。

HTTP_REFERER 
递交表单的文本的 URL,不是所有的浏览器都发出这个信息,不要依赖它

PATH_INFO 
附加的路径信息, 由浏览器通过GET方法发出.

PATH_TRANSLATED 
在PATH_INFO中系统规定的路径信息.

SCRIPT_NAME 
指向这个CGI脚本的路径, 是在URL中显示的(如, /cgi-bin/thescript).

QUERY_STRING 
脚本参数或者表单输入项(如果是用GET递交). QUERY_STRING 包含URL中问号后面的参数.

REMOTE_HOST 
递交脚本的主机名,这个值不能被设置.

REMOTE_ADDR 
递交脚本的主机IP地址.

REMOTE_USER 
递交脚本的用户名. 如果服务器的authentication被激活,这个值可以设置。

REMOTE_IDENT 
如果Web服务器是在ident (一种确认用户连接你的协议)运行, 递交表单的系统也在运行ident, 这个变量就含有ident返回值.

CONTENT_TYPE 
如果表单是用POST递交, 这个值将是 application/x-www-form-urlencoded. 在上载文件的表单中, content-type 是个 multipart/form-data.

CONTENT_LENGTH 
对于用POST递交的表单, 标准输入口的字节数.


web前端又是如何将表单内的数据提交给CGI server的呢?主要有两种方式GET和POST:

1.GET

当你使用这种方式时,所有的数据和参数都是存储在环境变量QUERY_STRING中的,CGI通过getenv("QUERY_STRING")来获取数据,然后进行解析。GET有一定得限制,当数据超过1024字节的时候,你必须选择POST方式来提交数据。

2.POST

当你使用这种方式时,CGI程序通过stdin标准输入来获取数据。但是这种方式没有类似于EOF的结束标记。所以我们必须先通过环境变量CONTENT_LENGTH来获取数据的长度。然后读取准确的数据。

CGI程序与web前端交互的方式有四种:

从环境变量获取数据

从标准输入获取数据

标准输出到文件或前端

标准错误输出

CGI又有两种工作模式:一种是普通的CGI,另一种是FASTCGI。这里我转载一篇文章来说明CGI与FASTCGI的区别及FAST的工作原理:

FastCGI是什么:是一个可伸缩、高速的在web server和脚本语言间通迅的接口
  CGI工作原理:每当客户请求CGI的时候,WEB服务器就请求操作系统生成一个新的CGI解释器进程(如php-cgi.exe),当CGI满足要求后,WEB服务器就杀死这个进程。
    所以,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以 提供良好的性能、伸缩性、Fail- Over特性等等。

    FastCGI的官方站点在http://www.fastcgi.com

  FastCGI的工作原理是:
  1、Web Server 启动时载入FastCGI进程管理器【PHP的FastCGI进程管理器是PHP-FPM(php-FastCGI Process Manager)】
  2、FastCGI进程管理器自身初始化,启动多个CGI解释器进程 (在任务管理器中可见多个php-cgi.exe)并等待来自Web Server的连接。启动php-cgi FastCGI进程时,可以配置以TCP和UNIX套接字(socket)两种方式启动。
  3、当客户端请求到达Web Server时,Web Server将请求采用TCP协议或socket方式转发到FastCGI主进程,FastCGI主进程选择并连接到一个CGI解释器(子进程php-cgi.exe)。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi.exe。
   4、FastCGI子进程php-cgi.ex完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在 WebServer中)的下一个连接。 而在CGI中,php-cgi子进程在此便被退出了。

  在上述情况中,你可以想象 CGI通常有多慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部dll扩展并重初始化全部数据结构。使用FastCGI,所有这些 都只在进程启动时发生一次。一个额外的好处是,持续数据库连接可以工作。
可以令PHP程序从原来的请求-启动-运行到请求-运行模式,大大提高了脚本的执行效率,减轻服务器的负荷。

原创粉丝点击