如何编写支持 CGI、FastCGI 和 mod_perl 的 Perl Web 应用程序?
我如何用 Perl 编写一个 Web 应用程序,以便它可以作为普通 CGI 脚本、FastCGI / FCGI 脚本以及 mod_perl
/ mod_perl2
(最好仅使用核心 Perl模块和那些来自 libwww-Perl 的模块,并最大限度地减少必须安装的 Perl CPAN 模块的数量)? 我想尽量减少将脚本从使用 CGI 更改为使用 FastCGI 或 mod_perl 所需的更改。
进一步的限制:如果可能的话,我想将 Web 应用程序保留在单个文件中,而不是像目前那样将其拆分为模块。
如果重要的话,所讨论的 Web 应用程序是 gitweb,Git Web 界面。
How can I write a web application in Perl so that it can work as plain CGI script, as FastCGI / FCGI script, and from mod_perl
/ mod_perl2
(preferably using only core Perl modules and those from libwww-Perl, and minimizing number of Perl CPAN modules one has to install)? I'd like to minimize changes one has to do to change script from using CGI to the one using FastCGI, or mod_perl.
Further constraint: if possible, I'd like to kee web application in single file, and not split it in modules, as it is currently.
The web app in question is gitweb, Git web interface, if it matters.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
我很惊讶还没有人给出明显的答案。 使用Catalyst。 使用 Catalyst,可以轻松地在任何 Web 环境中部署,包括普通 CGI、FastCGI、mod_perl 等。
I'm surprised no one's given the obvious answer yet. Use Catalyst. With Catalyst, it's trivial to deploy in any web environment, including vanilla CGI, FastCGI, mod_perl, and more.
将功能放入模块中。 让脚本只执行一项功能:选择要实例化的应用程序模块并处理特定于平台的内容,然后委托给通用功能。 因此,您最终将得到一个要调用的脚本、三个或四个模块来实现每个平台,以及一个模块来实现一般功能。
Put the functionality in modules. Make the script perform just one function: Choose which application module to instantiate and take care of platform specific stuff and then delegate to the common functionality. So, you will end up with one script to invoke, three or four modules to implement each platform, and one module to implement general functionality.
gitweb 已经使用了 CGI,根据 文档 (免责声明:我从未测试过这一点) ,支持所有开箱即用的:
最后一部分并不完全正确,因为您仍然需要 FCGI 来支持 FastCGI,这需要要安装的 C 编译器。
gitweb already uses CGI, which according to the Documentation (Disclaimer: I never tested this), supports all of those out of the box:
The last part is not exactly true, since you still need FCGI for FastCGI support, which needs a C compiler to install.
正如 Sinan 指出的,您将代码分成模块。 他没有使用神奇的术语“模型-视图-控制器”(MVC)。 您实际上是在问如何使用 MVC 并支持多个控制器。 您的模型和视图是相同的,并且不同的控制器使用它们来驱动应用程序。
As Sinan points out, you separate the code into modules. He didn't use the magic term "Model-View-Controller" (MVC). You're really asking how to use MVC and support multiple controllers. Your model and views are the same, and your different controllers use them to drive the application.
另一种可能的解决方案是使用 HTTP::Engine
(另请参阅 Perl 编程/HTTP::Engine 维基百科)。
Yet another possible solution would be to use HTTP::Engine
(see also Perl Programming/HTTP::Engine wikibook).