• ベストアンサー

ポーリングとHTMLデータのリロードの方法

次のことをする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"; }

  • Perl
  • 回答数4
  • ありがとう数10

質問者が選んだベストアンサー

  • ベストアンサー
  • ryu_chan
  • ベストアンサー率37% (69/186)
回答No.3

Ajaxを使えばできそうな気がします。 setInterval(checkData,5000); として5秒毎に、checkData関数を呼び出します。 checkData関数内では、Ajaxを使ってサーバーのデータを読み込み、現在のデータと照合し、更新していれば、 location.reload(true); として、リロードさせます。 JavaScriptのカテゴリーで質問をすれば誰かが詳細コードを書いてくれると思います。

tarobe98
質問者

お礼

ありがとうございした。 JavaScript、ちょっと調べてみようと思います。

その他の回答 (3)

回答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)の違いだけです。

tarobe98
質問者

お礼

回答ありがとうございました。 サーバープッシュは調べたときに見つけたのですが、 IEを使用するため、対応してないとのことなので諦めました。 Javascriptでなんとか実現できないか、試してみようと思います。

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.2

>私がやりたいのは、CGIでの処理を5秒ごとに行い、 >変化があったときのみリロードしたいのです。  これは原理的に不可能なのです。  HTTP通信の優れているところであると同時に、欠点。  FTPでの通信だと、接続は保たれて、操作コマンドと処理結果コマンドは別ですし、コネクションは保たれますが、HTTPは要求、応答が一度限りなのです。どんなにあがいても、こればかりはどうしようもない。  CGI側は、過去は知っているが未来は知らない。もし未来で変化するタイミングを知っているなら、 <meta http-equiv="refresh" content="5"> の5の値を変えて送信できるのだが・・

tarobe98
質問者

お礼

そうなんですか。 その辺のところはよくわかっていなかったもので。 別の方法(根本的に)を考えようと思います。 どうもありがとうございました。

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答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^^;でまとめればすっきりする。

tarobe98
質問者

補足

早々の回答ありがとうございます。 >print "<meta http-equiv="refresh" content="5">\n"; これだと5秒ごとにリロードしてしまいますよね? (違ったらすいません) 私がやりたいのは、CGIでの処理を5秒ごとに行い、 変化があったときのみリロードしたいのです。

関連するQ&A

  • HTMLのテーブルにデータを流し込む際のレイアウト

    度々、失礼させていただきます。なにぶん見よう見まねです。 「abc.csv」より条件(1)で抽出した後HTMLのテーブルに並べます。 但しこのままですとHTML上、右に伸びていってしまうので4つぐらいで 新しいテーブルに改行したいのですが、お力お貸しください。 <table> <tr> <td> <?php $Data=file("abc.csv"); for($i=0;$i<sizeof($Data);$i++){ $line=explode(",",$Data[$i]); if($line[0]=="0" && $line[1]=="1"){ //条件(1) print "<td><table><tr>\n" ; print "<td>{$line[2]}</td></tr>" ; print "<tr>" ; print "<td>{$line[4]}</td></tr>" ; print "</table></td>\n" ; } } ?> </td> </tr> </table>

    • ベストアンサー
    • PHP
  • txtに入っているデータの全件テーブル表示をする場合

    下記のdata.txt内のデータをphpでtable表示で全件を表示させたいのですが、最初の一件を表示することはできたのですが、あとのデータを同じように表示させる事を試みましたが、できませんでした。 一件目から縦に全件を表示させるにはどうしたらいいのでしょうか? よろしくお願いします。 data.txt------------ 12345,54321,田中,010,1234,5678,青森,2134,6854,山本,020,3210,5439,長崎,57404,74748,清水,030,5673,2865,岡山 ---------------------------------------------- <?php //ファイルオープン $fp = fopen('data.txt','r'); //データの読み込み $data=fgets($fp); //ファイルクローズ fclose($fp); //分割処理 $hairetu = split(',',$data); //出力処理 print("<table BORDER='1'>\n"); print("<tr><td>ID</td><td>パスワード</td><td>名前</td><td>TEL</td><td>住所</td></tr>\n"); print("<tr>\n"); print("<td>".$hairetu[0]."</td>\n"); print("<td>".$hairetu[1]."</td>\n"); print("<td>".$hairetu[2]."</td>\n"); print("<td>".$hairetu[3]."-".$hairetu[4]."-".$hairetu[5]."</td>\n"); print("<td>".$hairetu[6]."</td>\n"); print("<tr>\n"); print("</table>\n"); ?>

    • ベストアンサー
    • PHP
  • <FORM TYPE="subumit">でデータをCGIに飛ばして、画面には別のHTMLを表示する。

    #submitでデータを飛ばす(A.cgi)処理以外にもう一つウィンドウを開いて(B.html)中継をした上で(B.html)からリンクで(A.cgi)に飛ばせたいと思います。ちなみに質問No.994791も私の疑問に近いのかとも思い参照しましたが初心者でわかりません。 print "<td><form action=\"$script\" method=\"GET\">\n"; #認証後の投稿ページ画面へ(forum.cgiへパラメータを渡す/forum.cgi?id=$id&pw=$pw)へ飛ぶ print "<table align=\"center\"><tr><td>\n"; print "<tr><th><UL><LI>すでにパスワード取得済みの方はこちらからどうぞ</th>\n"; print "<tr><th>ログインID<th><input type=text name=id size=8></tr> \n"; print "<tr><th>パスワード<th><input type=password name=pw size=8></tr> \n"; print "<tr><th colspan=2><input type=submit value=' 認証する '></tr> \n"; #この辺に入れるのかな? #やりたい処理をまとめると<FORM TYPE="subumit">でデータをCGIに飛ばして、画面には別のHTMLを表示する。 #CGI入力されたデータを一個飛ばしてCGIで利用したいためです。 print "<td><input type=hidden\">\n"; print "</td></tr></table>\n"; print "<P><table align=center>\n"; print "<UL><LI> <a href=\"$postmail\">パスワードを新規取得の方</a> はこちら \n"; #認証の前処理:会員登録画面(postmail.html)へ飛ぶ#2004.12.6 print "<LI> <a href=\"$pwmake?mode=change\">パスワードを変更の方</a> はこちら \n"; print "</table></form>\n</body></html>\n"; exit;

    • 締切済み
    • CGI
  • HTML中のTABLEのデータを抽出する方法

    あるサイトの <table>タグ中のデータを抽出して、エクセルにコピーし そのデータを分析したいと考えています。 具体的にはタグ情報を削除して、データをカンマ(,)区切りで表示し、 それをコピペして、エクセルに貼り付ける方法を考えています。 <table> <tr> <td>100</td> <td>200</td> </tr> <tr> <td>300</td> <td>400</td> </tr> </table> ↓ 100,200 300,400 上記を実現できる方法をご存知でしたらぜひ教えてください。 いろいろ調べたところ、ブックマークレットという方法で できそうですが、マッチするものを見つけることができませ んでした。

  • データ

    データが送れているのかをプリントで確かめたのですが、$xの値しか表示されません。 セレクトボタンで選択した値が代入できません。 データが送られていないのでしょうか? どこが間違っているのか教えてください。 #!c:/perl/bin/perl <<省略>> print "<table border=1>"; print "<tr><td>商品番号</td><td>商品名</td><td>価格</td>"; print "<td>残り個数</td><td>注文数</td></tr>"; open(RF,"<butu.dat"); while(<RF>){ @data=split; print "<tr><td>$data[0]</td><td>$data[1]</td><td>$data[2]円</td>"; print "<td>$data[3]個</td><td><select name='ko[$n]'>"; for($i=1;$i<=$data[3];$i++){ print "<option value=$i>$i</option>"; } print "</select></td></tr>"; $n++; } close(RF); print "</table><br><br><input type='hidden' value='$n' name='gyo'>"; <<省略>> exit; ↓↓↓ #!c:/perl/bin/perl print "Content-type: text/html\n\n"; require 'cgi-lib.pl'; &ReadParse(\%in); $x=$in{'gyo'}; for($n=0;$n<$x;$n++){ $d[$n]=$in{'ko[$n]'}; } <<省略>> exit;

    • ベストアンサー
    • Perl
  • cgiでポーリングして取得したデータが変化していた時のみHTMLをリロードする方法

    Perlのカテゴリで質問したところ(質問番号:5634620)、JavaScriptで実現 できるかもしれないとのアドバイスを頂いたので、こちらで質問します。 次のことをするcgiを作りたいのですが  1. cgiを起動したらある装置からデータを読み込んできて配列及びファイルに   書き込み、その内容を表(HTML)に表示。(即時)  2. 5秒ごとに装置に対してデータを読みに行き(ポーリング)、変化があったら   (セーブしてあるデータと読みに行ったデータに違いがあったら)表(HTML)を    リロードして新しいデータの内容を表示する。 perlのカテゴリで下記のようなアドバイスを頂きましたが、 Javascriptは全くわからず、お手上げ状態です。 >Ajaxを使えばできそうな気がします。 >setInterval(checkData,5000); >として5秒毎に、checkData関数を呼び出します。 >checkData関数内では、Ajaxを使ってサーバーのデータを読み込み、現在の >データと照合し、更新していれば、 >location.reload(true); >として、リロードさせます。 実際にどの様に記述すれば実現可能か、教えていただけませんでしょうか。 よろしくお願い致します。

  • データのないセルに枠をつけるには

    現在、私が行なっている作業は、データを全件表示させようと思っています。 その際に、ソースの中に『TABLE・TR・TD』のタグを使用し、表を作成しているのですが、データが入っていない部分は表の枠が表示されず真っ白な状態になっています。 こうやったら良いのかな?といったソースはあるのですが、なかなかうまくできません。 <1つ目> echo "<TR>\n"; if($IP[$IP_C]!="") { echo "<TD>$IP[$IP_C];</TD>\n"; } else { echo "<TD><BR></TD>\n"; } echo "</TR>\n"; <2つ目> echo "<TR>\n"; if($BIKO[$BIKO_C]!="") { echo "<TD>$row[$BIKO_C];</TD>\n"; } else {   echo "<TD>&nbsp;</TD>\n"; } echo "</TR>\n"; といったように、色々と変えてやってみたのですが、うまく表示されませんでした。 『&nbsp』というのを使ってやってみようとも思ったのですが、良く分かりませんでした。 どなたかご存知の方がおられましたら、アドバイスを頂けますでしょうか? 説明不足で申し訳ございません。 以上、よろしくお願い致します。

    • 締切済み
    • PHP
  • 配列データの受け取り

    下記配列を受け取ることが出来ません。 エラーになります。 受け取り側にARRAY[0],ARRAY[1]と 表示されます。 実際は送信側のinputboxに入力した値を 受け取り側で表示させたいのですが・・・ おかしい箇所ご指摘いただけないでしょうか? それとも、PHPでは出来ないことなのでしょうか? //送信側 <html> <head><title>session.html</title></head> <body> 請求書 <form action="teke.php" method="post"> <table border="1"> <tr align="center"> <td>月</td> <td>日</td> <td>明細</td> <td>単価</td> <td>数量</td> <td>金額</td> </tr> <?php for($q=0;$q<10;$q++){ print"<tr>"; print"<td>"; print"<select name=kosu>\n"; print"<option value=''></option>\n"; for ($i=1; $i<13; $i++){ print"<option value=$i>$i</option>\n"; } print"</select>"; print"</td>"; print"<td>"; print"<select name=kosu>\n"; print"<option value=''></option>\n"; for ($j=1; $j<32; $j++){ print"<option value=$j>$j</option>\n"; } print"</select>"; print"</td>"; for($o=0;$o<4;$o++){ print"<td><input type='text'name='".$data[$q][$o]."'></td>"; } print"</tr>"; } ?> </table> <input type="submit" value="登録"> </body> </html> //受け取り側 <html> <head><title>session.html</title></head> <body> 請求書 <table border="1"> <tr align="center"> <td>月</td> <td>日</td> <td>明細</td> <td>単価</td> <td>数量</td> <td>金額</td> </tr> <?php for($q=0;$q<10;$q++){ print"<tr>"; print"<td>"; print"<select name=kosu>\n"; print"<option value=''></option>\n"; for ($i=1; $i<13; $i++){ print"<option value=$i>$i</option>\n"; } print"</select>"; print"</td>"; print"<td>"; print"<select name=kosu>\n"; print"<option value=''></option>\n"; for ($j=1; $j<32; $j++){ print"<option value=$j>$j</option>\n"; } print"</select>"; print"</td>"; for($o=0;$o<4;$o++){ $data[$q][$o]=$_POST["$data[q][o]"]; $_SESSION["$data[q][o]"].=$_POST["data[$q][$o]"]; print"<td>$data[$q][$o]</td>"; } print"</tr>"; } ?> </table> <input type="submit" value="登録"> </body> </html>

    • 締切済み
    • PHP
  • テーブルに送信ボタンをつける

    phpで以下のようなテーブルにデータを表示させるプログラムがあるのですが、表示させる各行の最後に送信ボタンを付けたいのですがどうすればよろしいでしょうか?よろしくお願いいたします。 print ("<TABLE border=\"1\"><TBODY>\n") ; for ($i = 0; $i < $numrows; $i++) { $data = pg_fetch_array ($result, $i) ; print ("<TR>") ; print ("<TD>" . $data[" "] . "</TD>"); print ("<TD>" . $data[" "] . "</TD>"); print ("<TD>" . $data[" "]. "</TD>"); print ("</TD>\n"); } print ("</TBODY></TABLE>\n");

    • ベストアンサー
    • PHP
  • HTML 表の中の表

    趣味でHPを作り始めたのですが表のところがよくわかりません。 大きな表(外枠)の中に2個目の表を作りたいのですが、どうしても2個目の表が大きな表(外枠)の真ん中に来てしまいます。2個目の表が大きな表の一番上にくっつくようにしたいのですがどうしたらいいのでしょうか。宜しくおねがいします。 <html> <body> <table border="1" height="500" width="300"> <tr> <td> <table border="1" width="100%"> <tr > <td colspan="3" > </td> </tr> <tr>   <td colspan="3"> </td> </tr> <tr> <td> </td> <td> </td> <td> </td> </tr> </table>  </td> </tr> </table> </body> </html>

専門家に質問してみよう