如何在Perl CGI脚本中生成长时间运行的进程?

时间:2010-07-08 13:04:50

标签: perl memory scripting cgi process

我正在编写一个Perl CGI脚本,但它正在成为一种资源匮乏,并且它一直被我的网络主机杀死,因为我一直在达到我的进程内存限制。我想知道是否有一种方法可以将我拥有的脚本拆分为多个脚本,然后让第一个脚本调用下一个脚本然后退出,这样整个脚本就不会立即存在内存中。我看到有一个导出器模块,但我不知道如何使用它,因为我只是学习Perl,我认为这不会解决我的内存问题,但我可能错了。

3 个答案:

答案 0 :(得分:3)

请参阅Watching long processes through CGI

另一方面,只是更好地管理内存也可以解决您的问题。例如,如果要一次将整个文件读入内存,请尝试编写脚本,以便逐行或以固定大小的块处理数据。在尽可能小的范围内声明变量。

尝试确定脚本的哪个部分正在创建最大的内存占用量,并在单独的问题中发布相关的摘录以获取更多内存管理建议。

答案 1 :(得分:1)

如果适用,请使计算/生成脱机。

创建一个守护进程或创建结果静态版本的预定作业,守护进程可以在事件(例如修改的文件)或设置的时间间隔内创建结果的新版本。

如果根据客户端输入生成页面,请查看分离逻辑,以便至少可以缓存部分应用程序。

旁注,除非满足您的需求,否则我将完全放弃CGI并查看mod_perlfastcgi,其中您有持久的perl进程来处理请求,这样可以节省分叉的开销一个新的perl解释器,加载模块等。

答案 2 :(得分:0)

是的,您可以从perl脚本启动另一个perl脚本,然后退出调用脚本:

http://perldoc.perl.org/functions/fork.html

示例代码:

#!/usr/bin/perl

my $pid = fork();
if (not defined $pid) {
    print "resources not avilable.\n";
} elsif ($pid == 0) {
    print "IM THE CHILD\n";
    sleep 5;
    print "IM THE CHILD2\n";
    exit(0);
} else {
    print "IM THE PARENT\n";
    waitpid($pid, 0);
}
print "HIYA\n";

但如果您希望第二个脚本能够使用CGI与您的网络服务器/用户进行通信,那么这将不起作用。如果您将perl脚本作为CGI运行,则必须将结果返回给用户。

所以你有两种方法可以解决这个问题:

  • 试着找出为什么要使用这么多内存并改进脚本。

  • 如果真的没有办法减少内存消耗,你可以使用daemonized perl-script作为worker-process,进行计算并将结果返回给你的CGI-perl脚本,在终止前等待结果。