0

重複の可能性:
Reg: Perl CGI script Autoupdate with New Data

時間リストを作成する代わりに、継続的に時間を更新する perl CGI スクリプト

#!C:/perl/bin/perl.exe
use warnings;
use strict;
use CGI;

local $| = 1;

my $cgi = new CGI;
my $string = localtime();
print $cgi->header();
print $cgi->start_html("Welcome");
print $cgi->h1("$string");
print $cgi->end_html();

print $cgi->header();
print $cgi->start_html("Welcome");
print $cgi->h1("$string");
print $cgi->end_html();
4

3 に答える 3

2

あなたの質問は、物事がどのように機能するかについての根本的な誤解を明らかにしています。

イベントのシーケンスは次のとおりです。

  1. Web サーバーは、特定の URL が要求されたときに特定のプログラムを実行するように構成されています。
  2. ブラウザは、リソースを要求する HTTP リクエストを作成します。
  3. サーバーはプログラムを実行し、その標準出力ストリームをキャプチャして、ブラウザーに送り返します。
  4. ブラウザにコンテンツが表示されます。

要求/応答サイクルが完了すると、トランザクションは終了します。サーバーは、送信したコンテンツがウィンドウに表示されているのか、アスキー アートに変換されたのか、正確にどこに行ったのかを知りません。コンテンツを送信し、それを処理します (TCP キープアライブなどはこのモデルを変更しません)。

したがって、「時間のリストを出力する代わりに、同じブラウザで現在の時間をフラッシュし続ける CGI スクリプト」というステートメントには意味がありません。サーバーは、送信済みの出力を取り戻すことはできません。

JavaScript と XHR を使用すると、ページ上の特定の要素のコンテンツを CGI スクリプトからの出力で更新できます

しかし、ここで、あなたがまったく注意を払っていないように見えるもう 1 つの根本的な問題が頭をよぎります

于 2012-05-15T16:23:05.303 に答える
2

PSGIに切り替えます。

my $app = sub {
    my $env = shift;
    return sub {
        my $respond = shift;
        my $writer = $respond->([200, ['Content-Type', 'multipart/x-mixed-replace; boundary=time']]);
        while (1) {
            $writer->write(
                "--time\n" .
                "Content-Type: text/plain\n\n" .
                localtime . "\n"
            );
            sleep 1;
        }

        # will never arrive here, but
        # install a signal handler and call this for cleanup
        $writer->close;
    };
};
于 2012-05-15T22:03:55.090 に答える
1

おそらく、ページが毎秒自動更新されるように、出力にMETA更新ヘッダーを提供したいとします。しかし、実際には、これにはJavascriptを使用することをお勧めします。

于 2012-05-15T13:22:57.490 に答える