
次のことをするcgiを作りたいのですが
1. 起動したらデータを読み込み、その内容を表に表示。(即時)
2. 5秒ごとにデータを読みに行き(ポーリング)、変化があったら表を
リロードして新しいデータの表を表示する。
下記のようにすると、リロードされずに表がいくつも表示されてしまいます。
(リロード処理を入れてないので当たり前なんですが)
また、その表示が5秒ごとではなく、かなり長い時間(数十秒?)たってから
1度に数個表示されるというのを繰り返してしまいます。
Q1 リロードさせるには、javascriptを使えばよいのかと思うのですが、
どのようなスクリプトを使えばよいのでしょうか。
また、javascriptでなくても他に方法があれば教えてください。
(Perlのプログラム上では無理でしょうか)
Q2 起動時にまずは最初のデータを表示させたいのですが、sleeを使うと
起動後すぐ表示されないように思いますが、どのようにしたらよい
でしょうか。
なお、下記テストプログラムでは、データを更新して表示する処理は
省いています。
よろしくお願い致します。
-------------------------
$kaisuu = 0;
$change = 0;
while (1) {
&data;
if($kaisuu == 0 ){
&hyou;
$kaisuu = 1;
}elsif (($kaisuu == 1) && ($change == 1)){
&hyou;
}
sleep 5;
}
sub data {
#データの読み込み処理
if(データに変化あり){
$change = 1;
}
}
sub hyou {
print "Content-type: text/html\n";
print "\n";
print "<html>\n";
print "<head>\n";
print "<title>Test</title>\n";
print "</head>\n";
print " <table border=2 frame=border>\n";
print " <tr><td>項目</td>\n";
print " <td>名前</td></tr>\n";
print " <tr><td>1</td>\n";
print " <td>まるまる</td></tr>\n";
print " <tr><td>2</td>\n";
print " <td>ばつばつ</td></tr>\n";
print " </table>\n";
print "</body>\n";
print "</html>\n";
}
No.3ベストアンサー
- 回答日時:
Ajaxを使えばできそうな気がします。
setInterval(checkData,5000);
として5秒毎に、checkData関数を呼び出します。
checkData関数内では、Ajaxを使ってサーバーのデータを読み込み、現在のデータと照合し、更新していれば、
location.reload(true);
として、リロードさせます。
JavaScriptのカテゴリーで質問をすれば誰かが詳細コードを書いてくれると思います。
No.4
- 回答日時:
> 1. 起動したらデータを読み込み、その内容を表に表示。
(即時)> 2. 5秒ごとにデータを読みに行き(ポーリング)、変化があったら表を
> リロードして新しいデータの表を表示する。
サーバープッシュCGIで可能です。
が、一部のブラウザは対応していないかもしれません。
(Content-Typeがmultipartの物に対応していない。
もしくは、サーバープッシュCGIを使う人がいなくなったため、ブラウザがサポートするのをやめた可能性がある。
または、単純に、私がテストしたmultipartの指定の仕方が悪かったとか。。。)
http://www.tohoho-web.com/wwwxx004.htm
sleepする直前にflush();しないと、STDOUTバッファに溜まったままになって、うまく表示が更新されないかもしれません。
$|=1;でもいいと思いますが、出力の効率が下がるんじゃないかと思います。
ネットワークをつなぎっぱなし、CGIアプリは動きっぱなしですから、ネットワークリソースやCPU負荷、メモリ使用量に注意して下さい。
通常はCGIで行わず、<meta>タグのrefreshかJavascriptのリロードを使うと思います。
Ajaxのはページ全体を書き換えるか(ページのリロード)、ページの一部を書き換えるか(Ajax)の違いだけです。
回答ありがとうございました。
サーバープッシュは調べたときに見つけたのですが、
IEを使用するため、対応してないとのことなので諦めました。
Javascriptでなんとか実現できないか、試してみようと思います。
No.2
- 回答日時:
>私がやりたいのは、CGIでの処理を5秒ごとに行い、
>変化があったときのみリロードしたいのです。
これは原理的に不可能なのです。
HTTP通信の優れているところであると同時に、欠点。
FTPでの通信だと、接続は保たれて、操作コマンドと処理結果コマンドは別ですし、コネクションは保たれますが、HTTPは要求、応答が一度限りなのです。どんなにあがいても、こればかりはどうしようもない。
CGI側は、過去は知っているが未来は知らない。もし未来で変化するタイミングを知っているなら、
<meta http-equiv="refresh" content="5">
の5の値を変えて送信できるのだが・・
そうなんですか。
その辺のところはよくわかっていなかったもので。
別の方法(根本的に)を考えようと思います。
どうもありがとうございました。
No.1
- 回答日時:
なにか思い違いされている。
reloadはブラウザへの指示
データを読み込みHTML出力は、CGIの処理
よって
sub hyou {
print "Content-type: text/html\n";
print "\n";
print "<html>\n";
print "<head>\n";
print "<title>Test</title>\n";
print "<meta http-equiv="refresh" content="5">\n";
print "</head>\n";
でもこんなまどろっこしい書き方をしなくても、print qq^^;でまとめればすっきりする。
この回答への補足
早々の回答ありがとうございます。
>print "<meta http-equiv="refresh" content="5">\n";
これだと5秒ごとにリロードしてしまいますよね?
(違ったらすいません)
私がやりたいのは、CGIでの処理を5秒ごとに行い、
変化があったときのみリロードしたいのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP htmlで複数の個数入力欄を表示させるには 1 2022/09/20 03:11
- Visual Basic(VBA) Selenium.ChromeDriverの使い方について 7 2022/09/22 06:43
- HTML・CSS テーブルタグのセルの幅の一部だけを指定 1 2023/03/12 12:02
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- HTML・CSS 自身のHPにYouTube動画を貼り付けるのが出来なくなり困ってます 1 2022/11/11 10:44
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- JavaScript jQueryで同じクラス名のものを別物として扱いたい 1 2022/06/17 14:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ポーリングとHTMLデータのリロ...
-
関数reverseの戻り値
-
phpからmysqlのテーブルにデー...
-
改行
-
Pythonでコンソールをクリアす...
-
Shift-jisのPerlから、UTF-8、E...
-
表という文字の扱いについて
-
N88-日本語 BASIC ASCII ファイル
-
pythonのopencv
-
配列を使っての文字列抽出について
-
C言語
-
日本語を入れた変数の中に指定...
-
VBAのNext forでエラーが出て困...
-
PythonでUTF8の文字列をリスト...
-
文字列のマッチについて
-
C言語課題です。なんとか教え...
-
変数をつなげたい
-
いつもお世話になっています 教...
-
CGI内でのjavaによるWindowopen
-
プログラミングを教えて下さい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
シェルスクリプトで、空白(ス...
-
16進の10進変換について
-
Pythonでコンソールをクリアす...
-
【至急!!!】python言語で本を見...
-
c言語 16進数の2進数への変換
-
関数「exists」と「defined」の...
-
変数名に変数を使用
-
変数の中は文字列か数値か調べ...
-
eval文中の+
-
ソケットでのデータ送受信につ...
-
awk の int()に関数について
-
アカウントプログラムについて
-
I2C接続のLCDディスプレイを使う
-
ダブルクォーテーションの中に...
-
動的ハッシュを作って取り出し...
-
PerlのDate::Simpleが動かない?
-
pythonで演算子を変数に代入す...
-
python'高階関数'について
-
「HSP」でキャラコードを使って...
-
pythonで改行を含めてfindする方法
おすすめ情報