我在Perl上编程已经很长时间了,我一直使用CGI技术来构建我的应用程序。现在我想重建它们,并在FCGI上写新的。请解释一下与f.e.Starman一起发布FastCGI和PSGI之间的区别。此外,我还想解释一下哪些Perl框架(使用FCGI)在今天"流行"?我知道我可以使用CGI::Fast强制我的CGI脚本作为FCGI脚本工作。还有其他模块可以做到这一点吗?
谢谢!
重要的是要理解CGI是信息服务器如何将数据传递到单独程序的标准定义。
通用网关接口(CGI)是一个用于运行信息服务器下的外部程序、软件或网关以独立于平台的方式。目前,支持
信息服务器是HTTP服务器。自1993年以来,万维网一直在使用该界面。这规范定义了名为"CGI/1.1"的接口及其使用
在Unix(R)和AmigaDOS(tm)系统上。
在标准模型中,web服务器每次需要外部程序时都会启动该程序,将数据封送为标准格式并将其传递给程序[作为环境的一部分,或通过外部程序的标准输入,具体取决于所使用的HTTP方法(GET、POST等)。程序处理数据,通过将标题和内容打印到标准输出返回数据,然后退出
CGI的主要缺点一直是每次调用都要启动外部程序。在Unix上,这需要web服务器在内存中创建自己的副本(fork),然后将外部程序覆盖在副本上(exec)。fork/exec循环在计算上是昂贵的,尤其是当您谈论一个覆盖了Perl解释器的大型Apache进程(多MB内存占用)时,它需要在运行Perl程序之前解析Perl程序。
为了从等式中去除fork/exec循环,开发了一些新东西。Mod_perl将perl解释器嵌入到apache进程中,消除了每次调用时fork/exec的需要,还允许缓存解析后的perl程序。各种组织报告的数字表明,吞吐量的增长是CGI的20到100倍。
第二种方法,称为FastCGI,也在同一时间被开发出来。在FastCGI中,外部程序(通常是容器或应用程序服务器)在启动http服务器的同时启动,http服务器代理请求到FastCGI进程。该模型提供了删除fork/exec循环的相同好处,并且有一组与mod_perl不同的优点/缺点。
最后,CGI/FastCGI/mod_perl,无论你选择什么,你的程序都必须了解如何获取网络服务器传递给它的数据,这就是问题的关键,几乎每一种后CGI技术都定义了它自己向程序传递数据的方式(PSGI中的GI仍然是网关接口的标准),但提供了一个适配器来将它的首选方式转换为CGI模型,以帮助简化收养。
我不确定我是否回答了你的问题,但谢谢你的提问。我很喜欢写这个答案;-)
您从错误的角度看待这个问题。不要考虑如何部署程序。相反,将程序写入PSGI接口。然后,您就可以在任何环境中部署应用程序——CGI、FastCGI、mod_perl等,而无需更改任何内容。
您可以使用Plack::Request和Plasck::Response等模块编写"原始"PGSI,但最好使用Dancer或Catalyst等框架。
如果您有想要在PSGI环境中运行的现有CGI程序,请参阅Plack::App::WrapCGI。