1

我试图找到通过 Perl CGI 脚本生成的相当大的 HTML 页面的问题。

只要生成的网页大小不超过 1 MB,我的 CGI 脚本就可以工作。

但是一旦网页大小超过 1 MB,页面就会在我的浏览器中显示一次正确,但重新加载后页面将被切断为 1 MB。效果会保持一段时间(> 5 分钟?),然后在重新加载一次后消失。

我想我确定了问题的一些可能来源:

  • perl 打印到的问题STDOUT
  • Apache 限制/错误
  • Apache的配置问题
  • 生成网页的缓存问题
  • 完全不同的东西

我已经尝试过的:

  • 重新启动 Apache 似乎不会将持续时间更改为“一次修复”。
  • Perl 的立即刷新由$|=1;

有谁知道问题出在哪里?

这是一个测试脚本,我可以用它来重现效果:

#!/Programme/perl/perl/bin/perl

$| = 1;

use strict;

use CGI qw/:standard -nosticky -debug/;   # CGI scripting
use CGI::Carp qw(fatalsToBrowser); # show error messages in browser
use CGI::Session qw(-ip_match);

my $cgi;

my $top   = 30;
my $i;

$cgi     = new CGI;

print <<EOF;
Expires: -1
Cache-control: no-store
Pragma: no-cache

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
     "http://www.w3.org/TR/html4/transitional.dtd">
<html>
<head>
<title>Testpage</title>
<meta http-equiv="Content-Type" content="text/html"; charset="iso-8859-1">
<META HTTP-EQUIV="expires" CONTENT="-1">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-store">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">

</head>
<body bgcolor="#efefef" text="#000000" marginwidth="0" marginheight="0">
EOF

for ($i=0;$i<10000;$i++){

    # any popup_menu
    print $cgi->popup_menu(-name     => "monthSel$i",
                            -values   => [1,2,3,4,5,6,7,8,9,10,11,12],
                            -default  => 1, 
                            -override => 1,
                            -style    => 'position:absolute; top: '. $top . 'px; left:50px'
                          );
    $top += 30;
}


# close body
print "</body>";
4

1 回答 1

0

好吧,我想我解决了这个问题,虽然我并没有真正找到这个问题的根本原因。

脚步:

  • 当我用不同的系统测试它时,一切都很好(至少有 5000 个弹出菜单)。
  • 本地主机本身不起作用
  • 但是:当通过常规网络堆栈强制数据包时(最初用于使用 Wireshark 进行调试,页面显示正确!

结论:似乎是系统的内部问题

在这里找到了通过网络堆栈强制本地数据包的方法:Sniffer for localhost (Windows OS) (use http://localhost./instead of http://localhost/)

于 2012-12-31T23:33:32.900 回答