5

我正在开发一些 CGI 脚本,并试图找到一种解决方案来减少当我导入大量带有“使用”的模块时产生的“启动时间”。

更新:

提供的解决方案很好,但我正在工作的脚本在控制台和 CGI​​ 模式下运行,检查是否存在一些典型的 HTTP 环境变量。

在“控制台模式”中,它们“正常”转储数据,在“html 模式”中,它们进行一些实时替换并将其他 HTTP 标头发送到客户端。

我想在这两种情况下改善启动时间。

4

6 回答 6

13

考虑使用CGI::Fast来启动一个 perl 进程来处理多个请求。将我的一些大型 CGI 脚本更改为 CGI::Fast 花费了我很少的精力。与 mod_perl 不同,在托管站点上运行 CGI::Fast 非常容易,因为您可以在不重新启动 Apache 的情况下重新启动脚本(至少当我要求 mod_perl 时,我的托管人告诉我)。

于 2009-03-27T18:36:01.563 回答
10

使用mod_perl来运行你的脚本怎么样?

于 2009-03-27T18:35:50.707 回答
9
  • 确保这实际上是您的瓶颈
  • 只导入你需要的模块
  • 确保您无需搜索无数个地方即可找到它们
  • 考虑让启动成本高昂的进程热运行(例如作为守护进程)并使用重量更轻的 CGI 脚本来启动它们
  • 查看各种加速器,而不是从 shell 执行完整的 CGI(取决于您用于提供页面的内容)。
于 2009-03-27T18:34:51.707 回答
5

你总是可以尝试less pragma:

use less 'starttime';

当然,这取决于系统*。您最好的选择是使用mod_perl或 FastCGI 模块之一:CGI:: FastFCGI等。

如果需要从命令行快速运行,您可能需要迁移到客户端/服务器架构(这就是 FastCGI 的全部内容)。

*警告目前没有系统为 less pragma 实现 starttime 选项。

于 2009-03-27T18:45:14.193 回答
2

好吧,其他人已经建议 CGI 可能是你的问题,所以我认为你不能从图片中删除 CGI。

您可能要考虑这篇旧文章。显然,启动时间缓慢的一个原因是巨大的@INC,因此将所有内容整合到一个简短的 PERL5LIB 中似乎有很大帮助(这似乎是一个公平的假设,但我从未尝试过)。

或者(或另外),如果您不介意在运行时支付一些价格,您可以使用Class::Autouse

享受!

于 2009-03-28T18:54:45.193 回答
1

尝试使用 SpeedyCGI 或 Persistent Perl。

两者都实现了大致相同的想法:它们不是 Perl 解释器,而是一个解析程序并将其保存在内存中的包装器,从而节省了每次运行时初始化解释器和解析所需的时间。

这应该适用于您描述的双环境设置,使用 CGI::Fast 或 mod_perl 时可能/可能不是这种情况。

编辑如果这有帮助,很好。如果没有,您将不得不测量您的脚本在哪里花费其运行时间。

于 2009-03-30T13:11:43.907 回答