1

Perl CGI スクリプトで生成された非常に大きな HTML ページの問題を見つけようとしています。

私の CGI スクリプトは、生成された Web ページのサイズが 1 MB を超えない限り機能します。

しかし、Web ページのサイズが 1 MB を超えるとすぐに、ページはブラウザで正しく表示されますが、リロード後、ページは 1 MB で切り取られます。効果はしばらくの間 (>5 分?) 残り、1 回のリロードで消えます。

問題の考えられる原因をいくつか特定したと思います。

  • perl の印刷に関する問題STDOUT
  • Apache の制限/バグ
  • Apache の設定の問題
  • 生成された Web ページのキャッシュの問題
  • まったく違うもの

私がすでに試したこと:

  • Apache を再起動しても、期間が「1 回の回復」に変更されないようです。
  • 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 ポップアップ メニューの場合)。
  • localhost自体が機能しませんでした
  • しかし: 通常のネットワーク スタックを介してパケットを強制すると (元々は Wireshark でデバッグするためでしたが、ページは正しく表示されました!

結論: システムの内部の問題のようです

ネットワーク スタックを介してローカル パケットを強制する方法は、次の場所にあります: Sniffer for localhost (Windows OS) (http://localhost./代わりに を使用http://localhost/)

于 2012-12-31T23:33:32.900 に答える