• 締切済み

内部処理中にNow Loadingみたいな文字を表示させたい

お世話になります。 PERLにて以下のことをしたいと思っているのですが、お知恵をお貸し頂けるでしょうか。 「内部処理中にNow Loadingみたいなページを表示させたいのですが、どうもうまくいかない。」 以下のような感じです。 =============================================== print "Content-type: text/html\n\n"; print << "EOF"; <html> <head>  ・  ・  ・ </head> <body>  ・  ・ (<body>~</body>の間にjsでNow Loadingを表示するよう設定) EOF &sub #←内部処理用サブルーチン #処理後html文を吐くもの print << "EOF"; </body> </html> EOF =============================================== こんな感じで書いて、jsを使ってNow Loadingを表示するようにしようと思ったのですが、これだと、&subが先に処理された上でNow Loadingと表示されてしまうようで、意味のないものになってしまいます。 そこでヘッダー部分(最初のヒアドキュメント)部分までを先に表示した上で&subが動くようにし、それが完了したら最後のフッター部分を表示するようにしたいのですが、どのような方法があるでしょうか? 非常に不明な文で申し訳ないのですが、アドバイス頂ければ幸いです。 よろしくお願い致します。

  • Perl
  • 回答数2
  • ありがとう数2

みんなの回答

  • taseki
  • ベストアンサー率66% (155/233)
回答No.2

アイデアはなかなかいいですが、ANo.1の方がおっしゃるようにprintの実行とブラウザに返されるタイミングを厳密に制御することは難しいです。 仮にできたとしても、ブラウザからみれば「データの続きがなかなか来ない」と見なされタイムアウトになる可能性もある、という致命的な問題もあります。 ANo.1の方が紹介されている方法の他に、NNならサーバープッシュという技術もありますが、いまどきはあまり一般的じゃないような気がします。 あとは、これが良いかは別として、逆にクライアントプルで実現できなくはないです。 スクリプトが、まだ処理中(待たせる)なら ------------ <META HTTP-EQUIV="REFRESH" CONTENT="10~ … Now Loading… ------------ というようなHTMLを吐き出し、 処理が完了したら ------------ 完了 ------------ などと、その結果を表示、というものです。つまり○秒ごとに完了したかどうか聞きに行く、という考えです。 ちなみに細かいことですがLoadingというと「読み込み中」という意味になりませんか?Process is executing...とかかな?

edaeda8765
質問者

お礼

こちらもお礼が遅れ申し訳ありません。 なるほど、そういう方法もありかもです。 一度試してみます。 ご回答ありがとうございました。

  • hikomin
  • ベストアンサー率63% (40/63)
回答No.1

CGIでは、基本的に処理を全て終えた後に、クライアントにサーバからのレスポンスが返ります。printした時点で出力されているのではありません。 最近流行の技法はAjaxになるかと思います。とりあえずNow Loadingと書かれた出力を表示し、ページ内からJavaScriptのXMLHttpRequestを用いてプログラムにアクセス、レスポンスが得られたらJavaScriptでデータを差し替えるというものです。 ひとまず調べてみることをお勧めします。

参考URL:
http://d.hatena.ne.jp/keyword/Ajax
edaeda8765
質問者

お礼

お礼が遅くなり申し訳ありません。 なるほど。ブラウザ出力は最後になってしまうんですね。 Ajaxというのは初耳ですので、少し調べてみます。 ご回答ありがとうございました。

関連するQ&A

  • 読み込み中に「Now Loading」を表示したい

    質問致します。読み込み中に「Now Loading」を表示させる質問はこのカテゴリーに何件かございますが、以下のパターンのように、インラインフレームで指定されたPHPファイルの読み込み中に「Now Loading」を表示することは可能でしょうか? <html> <head> <title>xxx</title> </head> <body> <iframe src="aaa.php" frameborder="0" scrolling="no" width="xxx" height="xxx"></iframe> </body> </html> 過去の質問によくあるファイルサイズの大きいJPGファイルの読み込みに時間がかかってしまう問題と今回の私の質問である、PHPファイル自体の読み込みに時間がかかってしまうという問題ではやはり視点が違うのでしょうか? どなたかアドバイスの程よろしくお願い致します。

  • CGIについて…エラーで表示されません。

    CGIの勉強を始めたばかりの初心者です。 参考書を読んでいて、サーバーの時間を取得して表示する…っていうので、 本の通りに記述したのですが、表示されないんです。 (まだ途中段階で、とりあえずhtmlを記述した所です。) 最初、print"<html>\n";等、全部区切って書いてみた時は、 サーバーの時間は表示されましたが、ブラウザでソースを表示すると、htmlは、 </body> </html> しか表示されていませんでした。 (間違ってるのかな?と思って見直したり書き直したのですが…何度やっても同じでした。) なので、print <<EOF; ~ EOFの中に記述してみたところ、 サーバーエラーになってしまって、表示されないんです。 無料のサービスのサーバーで、自作CGIもOKです。 サーバーのヘルプに書いてあったのを読んで、 cgi-binというディレクトリに入れて、パーミッションも755に設定しました。 どこかおかしいのでしょうか?それともサーバーの問題でしょうか? #!/usr/local/bin/perl print"Content-type:text/html\n\n"; $now=localtime(time); print <<EOF; <html> <head> <title>SAMPLE</title> </head> <body> $now </body> </html> EOF

    • ベストアンサー
    • CGI
  • 「Now Loading」の表示

    以前にNo.974758等の質問で、サムネイルJPEGが存在するだけ読み込んでマスクレイヤー配下に横展開させてScrollBarを付けて表示すると言う処理を完成させましたが、如何せんサムネイルが表示されScrollBarが現れるまで結構の時間を要してしまいます。10k程度のJPEGを20枚程度読み込むと5~6秒ほど時間を要します。 この間に、よくある「Now Loading・・・・」等と言う表現をしたいのですが、そんな芸当が出来るのでしょうか?。 どうぞ宜しくお願い致します。

    • ベストアンサー
    • Flash
  • PERLでのヒアドキュメントの呼び出し

    以下のようなCGIの改造を行いたいのですが、 sub abc{ ・ ここ1  ・ $check1=<<"EOF"; <HTML><HEAD><TITLE>test</TITLE></HEAD><BODY>  ・ <img src="$directryname[0]" width = "80">  ・ </BODY></HTML> EOF ここ2 print $check1; exit; ここ1、もしくはここ2のところに $directryname[0] = "http://abc/aa/a.jpg"; を入れてもsub abc内のimgタグで..jpgが表示されません。 ヒアドキュメントでぐぐって見ましたが、適切な回答が得られませんでした。よろしくお願いします。

    • ベストアンサー
    • Perl
  • print HTML~をヒアドキュメントで

    CGIを改造して利用したいと思っています。 データの結果をhtmlファイルに出力するようにしたいと考えています。 sub html_reg{ open(HTML,"+>>../$no.html"); print HTML "<html>\n<head>\n"; ~~ print HTML "</body></html>\n"; close(HTML); } と言う風になっています。 しかし、通常のhtml文なので、「print HTML "~\n";」をつけるのと「""」があったときに「\"\"」にするのがとても面倒です。 と言うことで、ヒアドキュメントで記載できないかと考えたのですが、print HTML の「HTML」の部分をどのようにしたらよいかがよくわかりません。 どのように記載すればよいでしょうか?お願いします。

    • ベストアンサー
    • Perl
  • ヒアドキュメントで表示した、ある特定の全角文字が文字化けする(直接printだとOK)

    Redhat7.3 perl5.6 タイトルの通りなのですが、 ヒアドキュメント中にある特定の文字列(確認できたのは、「表」「申」) をHTML表示すると、文字化けしてしまいます。 print "Content-type: text/html\n\n"; print '<html><head><title>test</title></head><body>'; print << "HTML"; 1:表 HTML print '2:表'; print '</body></html>'; という記述方法ですが、 2の方は正しく表示されるのですが、 1:の方が文字化けして表示されてしまいます。 他の全角文字は問題なく表示されています。 どなたか原因をご存知の方、ぜひともご教授ください。

    • ベストアンサー
    • Perl
  • 処理待ち

    送信ボタンを押してから処理が完了するまでの間に「処理中」というようなメッセージを 表示させたいと考え、sub waitでいろいろ試してみましたが、方法がわかりませんでした。 perlだけの処理で、このようなことは可能なのでしょうか? お手数ですが宜しくお願いいたします。 -------------------------------------- &wait("処理中"); &edit &message("処理完了"); sub wait { } sub edit { #ここで5秒以上かかる処理をさせています。 } sub message { print <<EOM; Content-type: text/html <html> <head> <title>message</title> </head> <body> $_[0] </body> </html> EOM exit; }

    • ベストアンサー
    • Perl
  • ヒアドキュメントが表示されない

    perl初心者です・・ perlを本で学習してる最中なのですが、print文だとブラウザに表示されるのに、ヒアドキュメントで記述するとブラウザに表示されません。 (AN HTTPDサーバーを使用して、起動させています。) 例えば、 #!/usr/bin/perl print "content-type: text/html\n\n"; print "<html><body>"; print "ああ"; print "<br>"; print ("いい","うう","ええ","です"); print "<br>"; print "</body></html>"; ↑この記述だとブラウザに表示されますが、 #!/usr/bin/perl print <<HTML_DOCUMENT; content-type: text/html <html> <body> ああいいううええです </body> </html> HTML_DOCUMENT ↑このようにヒアドキュメントに書き換えてブラウザで表示させると、 サーバーが見つかりませんと表示されます。 ちなみに、本に添付してあるCD-ROMの回答ソースをコピペして表示させてみましたが、同様にサーバーが見つかりませんと表示されます。 ですので、文法には間違いはないと思うので、ANHTTPDサーバーに原因があるのではないかと思われるのですが、何か、ANHTTPDサーバーに設定をする必要があるのでしょうか? 教えてください。 ちなみに、環境windowsXPです。

    • ベストアンサー
    • Perl
  • ヒアドキュメントの中で演算子を使いたいのですが、

    ヒアドキュメントの中で演算子を使いたいのですが、うまくいきません。どう書けば良いのでしょうか? 下記のような感じの時、while文のヒアドキュメントの中で、 $k++; を実行したいです。 $body= "<div>"; $k=1; if (true) {   $body .="処理";    while ($result = mysql_fetch_array(○○)) { $body .= <<< EOF    処理    $k++; EOF;     } } body .="</div>" {$k++;}で括ったりしてみたのですが、うまくいきません。 $k++;だけ実行したいです(出力はしたくない) 最終的には、 ヒアドキュメントの中で、 $k++; を実行できなくても、 while文の中で、$k++; できれば良いのですが……

    • ベストアンサー
    • PHP
  • エラーメッセージがうまく表示されません。

    フォームから年月日を取得し、フォーム入力がなかった場合、 エラー表示がされるようにしたいと思っています。 下記のようにif文とサブルーチンで処理しようとしていますが、 何か問題になる点はありますでしょうか? ご教授お願いします。 ### 入力チェック ##### if($in{'year'} eq "" || $in{'mon'} eq "" || $in{'day'} eq ""){ &errer(100,"日にちを指定してください"); } ### エラーチェック ##### sub errer{ ($num,$word) = @_; print <<EOF; <html> <head> <title>エラー</title> </head> <body> Error $num<br> $word<br> <br> <br> <br> <a href="JavaScript:history.back()">戻る</a> </body> </html> EOF }

    • ベストアンサー
    • CGI

専門家に質問してみよう