我已经在Perl上编程了很长时间,我一直使用CGI技术来构建我的应用程序。现在我想重建它们并在FCGI上写新的。请用f.e解释未使用的FastCGI和PSGI之间的区别。接龙。另外我要解释一下Perl框架(使用FCGI)今天是什么“趋势”?我知道我可以使用CGI :: Fast强制我的CGI脚本作为FCGI脚本工作。有没有其他模块可以做到这一点?
谢谢!
答案 0 :(得分:6)
你从错误的角度看待这个问题。不要考虑如何部署该程序。而是将您的程序写入PSGI界面。然后,您将能够在任何环境中部署您的应用程序 - CGI,FastCGI,mod_perl等,而无需进行任何更改。
您可以使用Plack::Request和Plack::Response等模块编写“原始”PGSI,但建议您使用Dancer或Catalyst等框架。< / p>
如果您希望在PSGI环境中运行现有的CGI程序,请参阅Plack::App::WrapCGI。
答案 1 :(得分:5)
重要的是要理解CGI是how an information server passes data to a separate program的标准定义。
通用网关接口(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程序才能运行它。
为了从等式中删除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,无论你选择哪个,你的程序都必须了解如何获取Web服务器传递给它的数据,这就是问题的关键,几乎每一个CGI后技术定义了它自己的数据传入/传出程序的方式(PSGI中的GI仍然是网关接口的标准),但提供了一个适配器,将它的首选方式转换为CGI模型,以帮助简化采用。
我不确定我是否已经回答了你的问题,但感谢您的提问。我很喜欢写这个答案; - )