
次のことをする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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
16進の10進変換について
-
swift 文字コードから文字に変...
-
シェルスクリプトで、空白(ス...
-
qq!!の意味を教えてください。
-
コマンド find の「繰り返し」...
-
チェックボックスのCGIへの値の...
-
c言語 16進数の2進数への変換
-
pythonで演算子を変数に代入す...
-
Pythonでコンソールをクリアす...
-
tab区切り配列のtab数を検索
-
関数「exists」と「defined」の...
-
ポーリングとHTMLデータのリロ...
-
Application.ScreenUpdating = ...
-
JSONで文字列が長い時
-
<SELECT>タグの折り返し
-
[python] 文字列を変数名として...
-
メモリをアドレスを直接指定し...
-
formで特定のinputを送信しない...
-
セレクトメニューで2つの項目...
-
実行時エラー 3020の対策
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語 16進数の2進数への変換
-
16進の10進変換について
-
【至急!!!】python言語で本を見...
-
シェルスクリプトで、空白(ス...
-
シェルスクリプト+perl
-
Pythonでコンソールをクリアす...
-
I2C接続のLCDディスプレイを使う
-
UWSCのSELECT文の記述方法
-
pythonを使ったプログラミング...
-
pythonの*
-
数値かどうかの判定方法
-
pythonで演算子を変数に代入す...
-
pythonの この問題が分かりませ...
-
関数「exists」と「defined」の...
-
pythonのmap、結果の利用は1度...
-
文字のカラーとフォントの指定...
-
awkの正規表現での最左最短マッ...
-
チェックボックスのCGIへの値の...
-
変数名に変数を使用
-
コマンド find の「繰り返し」...
おすすめ情報