【问题标题】:How does one build a website in Perl without CGI?如何在没有 CGI 的情况下用 Perl 构建网站?
【发布时间】:2015-01-04 11:03:28
【问题描述】:

我问了一个关于 Python here 的单独问题,并被告知 “经典 CGI 根本不是使用任何东西的最佳方式。经典 CGI 服务器必须为每个请求生成一个新进程”

现在我正在使用 Apache 开发一个基于 Perl 的网站,我的所有脚本都以:

use CGI;

这是个问题吗?是否有更新或更好的方法来构建基于 Perl 的网站?

【问题讨论】:

  • 听起来你被引向FastCGI
  • 这里有几件事在起作用:Web 服务器界面和应用程序框架。替代接口是 mod_perl、FastCGI 和 PSGI(这是关于“经典 CGI”的评论所指的)。替代框架包括 Mason、Dancer/Dancer2、Catalyst 和 Mojolicious 等。请注意,您实际上可以将CGI.pm 模块 与FastCGI 接口 一起使用,例如。

标签: apache perl web cgi mod-perl


【解决方案1】:

使用Plack 或基于Plack 构建的框架(例如CatalystDancer/Dancer2)编写您的网站。

然后,您有多种选择部署网站。您可以将其部署为 CGI 脚本(易于执行,但效率低下),或使用 FastCGI 或 Apache 的 mod_perl,或者完全忘记 Apache 并使用独立的 Perl Web 服务器,例如 Starman。另一个选项是 uWSGI,它在概念上类似于 FastCGI。

Apache 的 mod_proxy 允许您采用混合方法进行部署。您的网站可能在 Apache 上运行,它可以将特定 URL 的请求转发给 Starman。

【讨论】:

  • -1:这是一个非常有信心的解决方案,因为您根本不知道 OP 需要完成什么。建议他们用Plack 写一个网站,然后回到CGI 有点奇怪。
  • 使用 CGI.pm 和使用 CGI 接口是有区别的。 CGI.pm 非常粗鲁,应该避免。 CGI 作为 Web 服务器和脚本之间的接口是完全可以的。当然,效率低下,但它也有其优点:每个请求都作为单独的进程运行,这意味着发生内存泄漏或段错误,它至少只会影响该请求,并且下一个请求将重新发生。
【解决方案2】:

CGI perl 模块是一种与网络服务器交互的方式。它完成了它一直打算做的工作,但它已被各种 Web 开发框架所取代。

一直是removed from the perl core:

The rational for this decision is that CGI.pm is no longer considered good practice for developing web applications, including quick prototyping and small web scripts. There are far better, cleaner, quicker, easier, safer, more scalable, more extensible, more modern alternatives available at this point in time. These will be documented withCGI::Alternatives

但是,各种框架都有一些学习曲线,而且我个人发现它们适合“适当的 wesbites” - 而不是“带有 Web 界面的脚本”类型的东西,我倾向于拼凑在一起。所以我建议阅读这些替代方案,如果你想做一些聪明的事情 - 使用其中之一。

如果你不是,你可能一开始就不需要CGI

【讨论】:

  • +1:我同意你所说的一切,除了最后的“你可能一开始就不需要CGI”。有很多 CGI 以编写有效的 HTML 为中心,但也有一些有用的部分可以帮助您在没有事先知识的情况下编写 HTTP 响应。
  • 嗯,我一直发现print "Content-Type: text/html\n\n"; 工作得很好;p。我还没有找到像 CGI 这样实际上可以直接“使用”的替代方案之一。
  • 那些行终止符应该正确地被"\r\n"写入:raw文件句柄。如果您一直只在 Windows 上工作,那么您的版本可以工作,但它总是use CGIprint header 更简单、更可靠。您应该尝试以同样的方式回复POST 请求。
  • 这个问题很可能不是关于 CGI.pm,而是关于使用 CGI 脚本。今天很多人问初学者关于 Perl 的问题,都是被 1995 年的文档驱使的。如果您不相信我,请尝试在您选择的 #perl 中闲逛一段时间。
猜你喜欢
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 2023-03-10
  • 2015-09-22
  • 2020-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多