欢迎各位兄弟 发布技术文章
这里的技术是共享的
cgi是一种接口,不管用什 么语言都可以按照这个接口进 行实现。一般服 务器判断需要调用cgi程序前,会把请求的GET参数放在环境变量QUERY_STRING里,POST请求内容则通过标准输入流输送到cgi程序内。cgi程序只需要将HTTP协议(包括HTTP头和HTTP Body)打印到标准输出流stdout,服务器就会把它们直接传输给浏览器。
举个栗子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | //c++实现cgi接口,打印query string和post data #include <iostream> using namespace std; int main() { cout << "Content-type:text/html\n\n" ; const char *queryString = getenv ( "QUERY_STRING" ); if (queryString != NULL) { cout << "<h1>query string is :" << queryString << "</h1>" << endl; } else { cout << "<p>No query string</p>" << endl; } string postData, tmpData; while (cin >> tmpData) { postData += tmpData; } if (postData != "" ) { cout << "<div> " << postData << " </div>" << endl; } else { cout << "<p>No post data</p>" << endl; } return 0; } |
把它编译好,命名为test.cgi,然后扔到服务器到cgi目录里。然后访问类似于http://localhost/cgi/test.cgi?a=b&c=d的URL,服务器就会把a=b&c=d放到QUERY_STRING环境变量中传给test.cgi。最后能看到页面上显示出query string is a=b&c=d。也可以创建一个表单,把数据POST到http://localhost/cgi/test.cgi,然后可以看到页面上显示出所有的POST data。
php是一种脚本语言,它可以用来做很多事。。。比如说用来写CGI程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #!/usr/env php <?php echo "Content-type:text/html\n\n" ; $queryString = $_ENV ( "QUERY_STRING" ); if ( $queryString != NULL) { echo "<h1>query string is : $queryString</h1>" ; } else { echo "<p>No query string</p>" ; } $postData = file_get_contents ( "php://stdin" ); if ( $postData != "" ) { echo "<div> $postData </div>" ; } else { echo "<p>No post data</p>" ; } ?> |
好吧它的功能跟上面C++写的程序一毛一样,我们把它加上“可执行属性”chmod +x testphp.cgi然后扔到cgi目录,然后访问http://localhost/cgi/testphp.cgi?a=b&c=d,以及用表单post数据给它,看到的效果应该是一样的。
所以你也看到了,服务器调用CGI程序,它才不管你用啥实现的,反正接口都定好了,只要按接口来编程就行。
但一般服务器调用PHP和调用CGI程序的逻辑不一样。CGI程序需要自己解析QUERY_STRING和POST_DATA,PHP应该是通过另一套扩展跟服务器交互的,所以一般用PHP直接写网页的时候,写网页的方式跟平时还真不太一样,比如说,服务器的php扩展已经帮我们把query string和post data解析成了数组,我们直接取值就好了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?php if (isset( $_GET )) { print_r( $_GET ); } else { echo "<p>No query string</p>" ; } if (isset( $_POST )) { print_r( $_POST ); } else { echo "<p>No post data</p>" ; } ?> |
存成test.php之后访问http://localhost/test.php?a=b&c=d,或者表单提交内容到页面。可以看到输出的数据都是结构化的,已经变成数组了。而且,HTTP头也不需要我们自己输出了(特殊情况除外)。
来自 https://zhidao.baidu.com/question/372086873886214804.html