Apache httpd Web服务器如何与Perl或PHP或CGI通信并获取输出并返回响应?

时间:2011-08-01 13:56:47

标签: php perl apache cgi

从客户端浏览器到Apache httpd webserver,通过TCP / IP(套接字)有一个明确定义的协议HTTP。我很难理解从Apache httpd webserver到Perl或PHP或CGI使用的通道/协议是什么?它是通过套接字或pipse或消息队列或信号进行进程间通信吗?有人能否了解幕后的真实情况?是不是Apache httpd webserver执行另一个程序(Perl或PHP)并捕获输出然后将其重新发送到客户端浏览器?

来自Linux Server Security

  

CGI协议未指定Web服务器应如何与CGI程序通信。有两个主要的解决方案:

     

独立CGI计划

     

Apache接收CGI请求,打开到外部程序的双向管道,向其发送CGI输入数据,并将程序的输出返回给客户端。作为一个单独的过程,程序可能会崩溃而不会关闭Web服务器。不好的一面是,开始新流程的速度相对较慢。

     

内置CGI程序

     

该程序被重写为Apache模块,只有在Apache进程启动时才会产生启动成本。这比外部程序快得多,并且可以访问Apache的内部和其他模块。 Apache中最流行的CGI模块是Perl(mod_perl)和PHP(mod_php)的解释器引擎。

1 个答案:

答案 0 :(得分:6)

通过两个通道完成与CGI程序的通信:简单的IO重定向(即STDIN和STDOUT)和环境变量。

HTTP服务器将请求发送到CGI的STDIN。它从CGI的STDOUT读取HTTP响应并将其(略微修改)发送到客户端浏览器。其他服务器数据(如请求大小或某些服务器参数)设置为通常以HTTP _开头的环境参数。