Perl 如何将进程与CGI分离,以便从内存中存储和读取文件?

Perl 如何将进程与CGI分离,以便从内存中存储和读取文件?,perl,caching,cgi,pipe,named-pipes,Perl,Caching,Cgi,Pipe,Named Pipes,我是否能够从一个CGI脚本中生成一个分离的类似守护进程的进程 将读取的文本文件存储在内存中,然后在下一次cgi执行中重新访问内存,使用管道读取数据 大多数托管ISP是否允许分离进程?在unix/linux系统上,内存管道是否快速且易于编码/使用 有没有一种解决方案,不需要使用任何额外的CPAN模块就可以实现?这是一个CGI过程,因此我希望将其保持在最小值。如果您绝对希望文件的内容出现在内存中,一个更简单的解决方案是创建一个RAM磁盘并将其存储在内存中。那么您就不必对cgi脚本做任何特殊的操作。假

我是否能够从一个CGI脚本中生成一个分离的类似守护进程的进程 将读取的文本文件存储在内存中,然后在下一次cgi执行中重新访问内存,使用管道读取数据

大多数托管ISP是否允许分离进程?在unix/linux系统上,内存管道是否快速且易于编码/使用


有没有一种解决方案,不需要使用任何额外的CPAN模块就可以实现?这是一个CGI过程,因此我希望将其保持在最小值。

如果您绝对希望文件的内容出现在内存中,一个更简单的解决方案是创建一个RAM磁盘并将其存储在内存中。那么您就不必对cgi脚本做任何特殊的操作。

假设您有一个简单的
资源。cgi

#! /usr/bin/perl

use warnings;
use strict;

use Reader;
use CGI qw/ :standard /;

print header("text/plain"),
      "Contents:\n",
      Reader::data,
      "-" x 40, "\n";
它的产量是

Content-Type: text/plain; charset=ISO-8859-1 Contents: This is a data file with some very interesting bits. ---------------------------------------- 接下来,它定义了集合点:

my $PIDFILE = "/tmp/reader.pid";
my $DATA    = "/tmp/file.dat";
my $PIPE    = "/tmp/reader.pipe";
潜艇。如果守护进程已在运行,则无需执行任何操作。否则,我们将分叉守护进程并将其进程ID写入
$PIDFILE

sub import {
  return unless my $fh = take_lock();

  my $child = fork;
  die "$0: fork: $!" unless defined $child;

  if ($child) {
    print $fh  "$child\n" or die "$0: write $PIDFILE: $!";
    close $fh             or die "$0: close $PIDFILE: $!";
    return;
  }

  # daemonize
  close $fh;
  chdir "/";
  open STDIN,  "<", "/dev/null";
  open STDOUT, ">", "/dev/null";
  open STDERR, ">", "/dev/null";
  setsid;

  open $fh, "<", $DATA or die;
  undef $/;
  my $data = <$fh>;
  close $fh;

  while (1) {
    open my $fh, ">", $PIPE or die;
    print $fh $data         or die;
    close $fh;
  }
}
最后,读取管道非常简单:

sub data {
  open my $fh, "<", $DATA or die "$0: open $DATA: $!";
  local $/;
  scalar <$fh>;
}
您将注意到,守护进程中的操作仍然可能失败。为了您的理智,您可能希望以某种方式记录事件,而不是沉默地窒息


至于主机是否允许长时间运行的进程,这将因提供程序而异,但即使您的守护进程不时被关闭,上面的代码也会根据需要重新启动它。

为什么要这样做?你想解决什么问题?你想要工作吗?它可以映射文件,因此这些文件不在内存中,但它们的行为与内存中的一样。我在中写了一些关于这方面的内容。

我正在寻找一个可移植的解决方案……这在平均共享web主机上有两个工作servers@Jera-我怀疑ram磁盘解决方案的可移植性不如
产生deamons并与管道进行通信。这是怎么回事?我不是ram磁盘方面的专家,如何在主机上轻松设置?所有主机都允许吗?
sub take_lock {
  sysopen my $fh, $PIDFILE, O_RDWR | O_CREAT or die "$0: open $PIDFILE: $!";
  flock $fh => LOCK_EX                       or die "$0: flock $PIDFILE: $!";

  my $pid = <$fh>;

  if (defined $pid) {
    chomp $pid;

    if (kill 0 => $pid) {
      close $fh;
      return;
    }
  }
  else {
    die "$0: readline $PIDFILE: $!" if $!;
  }

  sysseek  $fh, 0, SEEK_SET or die "$0: sysseek $PIDFILE: $!";
  truncate $fh, 0           or die "$0: truncate $PIDFILE: $!";

  unless (-p $PIPE) {
    system("mknod", $PIPE, "p") == 0
                            or die "$0: mknod exited " . ($? >> 8);
  }

  $fh;
}
sub data {
  open my $fh, "<", $DATA or die "$0: open $DATA: $!";
  local $/;
  scalar <$fh>;
}
1;