jqueryのajaxを使って通信先のphpが発行するhtmlを受信して受信側の<div id="data"></div>に
表示させているのですが、通信先のphpが処理して生成したhtmlの途中結果を受信して
表示させるにはどのようにすれば良いのでしょうか?
例えば通信先のphpを
<?php
ob_start();
for ( $i = 1; $i <= 100000; $i++ ) {
if ($i % 100 == 0) {
echo "■";
}
@ob_flush();
@flush();
usleep(30000);
}
?>
このようにして受信側を
<div id="data">■■■</div>
というようにプログレスバーみたいに次々と■を増やしていきたいのですが、実行してみると最終結果の
<div id="data">■■■■■■■■■■■■■■■■■■■■■■■■(…省略)</div>
だけが出力されてしまいます。
どのようにすれば良いのか教えて頂きたいです。
どうぞよろしくお願い致します。
No.2ベストアンサー
- 回答日時:
一応、補足。
CGIを使わない静的なファイルであればApacheなどのウェブサーバーが自動的にcontent_lengthを計算してくれますが、
動的な生成ではプログラム終了まで送出サイズがわからないため、content-lengthが計算できません。
そのため、自分で計算する処理を入れなければなりません。
CGI(PHP)からcontent-lengthを送出する方法ですが、以下のような考え方で行ってください。
バッファにすべてのデータを貯めておく。
global $buffer;
$buffer='<div id="data">';
$buffer.='■';
$buffer.='</div></html>';
バッファサイズを測り、ヘッダを生成する
$bytes=strlen($buffer);
header('content-length: ' . $bytes);
データを送出する。
echo $buffer;
---------------------
もう一つの方法として、Comet(ロングポーリング)を使う方法があります。
PHP側の処理をsleepさせずに、一旦終了させます。
その後JavaScriptで通常のonreadystatechangeの処理(受信完了処理)を行い、直後(または一定時間おいて)にもう一度サーバーにアクセスします。
こうする事で、アクセス完了処理が何回も行われる事になりますので、(擬似的な)リアルタイム更新が可能になります。
詳しくは「ajax comet」で検索してみてください。
クライアント側で一定時間待機後にアクセスする通常のポーリング
(<meta name="refresh" content="10">のAjax版)
なら、Cometほどサーバー負荷はありません。
こちらの方がよく使われます。
チャットルームなどがこのポーリングです。
Twitterの「新しい発言」が自動的に増えていくのとか、スクロールするごとに次ページの内容が表示されていくというのも、
画面に追加するという点ではポーリングと変わりありません。
ぶっちゃけ、単発のAjax通信は「Ajax」と呼ぶに対して、連続するAjax通信に違う名前を付けただけです。
-----------------
純粋な双方向通信を行う方法
ブラウザもサーバーも、両方が対応している必要がありますが、WebSocketを使用する方法があります。
要はブラウザが行っている通信行程を全てJavaScriptで記述し、
サーバー側のプログラムは、Apache(Apache上で動くものではなく、Apacheそのもの)を作るような物です。
そのため、一般のレンタルサーバーでは使えません。
「websocket」で検索してください。
No.1
- 回答日時:
XMLHttpRequest2であれば、
.onprogressイベントハンドラで処理すれば、通信途中の状況を取得する事が出来ます。
(ブラウザが対応していれば)
http://dvcs.w3.org/hg/progress/raw-file/tip/Over …
ProgressEventインターフェースで受け取れるのは受信バイト数、総バイト数のみです。
総バイト数はおそらくcontent-lengthヘッダだと思います。
そのため、CGI等から出力する場合でcontent-transfer-encodingヘッダがchunckedになっていると、content-lengthヘッダを生成できなかったりchunkのバイト数だけになっていることがあるため、総バイト数が0になるか非常に不安定、または常にtotalとloadedが同じ値になると思います。
jQueryはプラグインでonprogressに対応しているようです。
https://github.com/kpozin/jquery-ajaxprogress
探せば同様のプラグインが他にもあるかもしれません。
質問文のような、PHPの出力を逐次出力するという事はできません。(サーバーから受信したデータを受け取るプロパティがないため。)
バイト数から■の数を計算し、出力してください。
お教え下さってありがとうございます。
>質問文のような、PHPの出力を逐次出力するという事はできません。
そうなのですね。なんとなくできないだろうな…とは思っていたのですが…。
教えていただいた件ですが、自分には未知の部分が多く、これから勉強する上での
指標とさせて頂きたいと思います。
そのため、詳しくお返事できないことをお許し下さい。
ただ実現に向けて実行していくことは確かです。
そのとき再びわからないことがありましたらまた質問させて頂きたいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PDFを(htmlのように)無限に縦...
-
電子ピアノの音を録音したいの...
-
入力フォームの値をQRコードで...
-
GASでスプレッドシートの一番上...
-
バッチファイル 特定ウインドウ...
-
svgをimgタグで表示できません
-
自作の地図をグーグルマップの...
-
富士通のオフコンの部品交換
-
b75h2-m2 biosアップデートした...
-
正規表現で、特定の文字列を含...
-
VBAでクイズゲームの作り方
-
以下のURL入れますか?皆さんは↓
-
画像のドットの部分が抜けてい...
-
Chinapost こよパズルどう動か...
-
非同期通信で掲示板を作る際の...
-
非同期通信を使うタイミングが...
-
PYTHONのtkinterについて
-
Pythonのtkinterについて
-
Pythonを勉強する道のり
-
Pythonを無料(安価)で学ぶ方...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ASP.NET(VB)VBソースからJavas...
-
ブラウザ閉じたらサーバー処理...
-
PHPでフォームの自動入力できま...
-
php ob_flushが全く動作しない
-
JSTLを利用してJavascriptの結...
-
呼び出し元のURLを知りたいのです
-
sleepの負荷
-
PHPのプログラムが同時に呼び出...
-
読み込み中に「Now Loading」を...
-
PHPにコネクションプールってあ...
-
【PHP】ブラウザでのメッセンジ...
-
ブラウザを閉じた瞬間にログアウト
-
掲示板の荒らし対策
-
php と SQL
-
may be mail server is downと...
-
PHP、JavaScript、どちらでも処...
-
PHPで一定時間が経過すると処理...
-
PHPで15桁程度のユニークコード...
-
PHPでメッセージボックス表示
-
PHPで一時停止しながら最後まで...
おすすめ情報