長時間実行するPHPスクリプトのプログレスバーを作成する必要があるため、スクリプトの進行状況をjsonファイルに書き込んでから、Javascriptで読み取ることにしました。Firefoxではすべて正常に動作しますが、ブラウザをChromeに変更すると動作しなくなります。コンソールウィンドウにエラーはありません。Chromeは、ユーザーがPHPスクリプトを開始すると、jsonファイルの読み込みを停止しますが、PHPの実行が開始される前にこのファイルを読み取ります。コードに問題がありますか、それともChromeブラウザの通常の動作に問題がありますか?
PHP:
$fp = fopen($this->writeFile, "w");
fwrite($fp, json_encode($values));
fclose($fp);
//for safety we will make a copy and let client access the copy.
copy($this->writeFile, $this->readFile);
Javascript:
getProgress();
function getProgress() {
$.ajaxSetup({ cache: false });
$.getJSON("../../../../upload/status.json", function(data) {
var pbvalue = 0;
if(data){
var total = data['total'];
var current = data['current'];
if(total != 0)
pbvalue = Math.floor((current / total) * 100);
$(".progress-bar .indicator").width(pbvalue+"%");
$(".progress-text").text(current+"/"+total);
}
if(pbvalue < 99)
setTimeout("getProgress()", 3000);
});
}
JSONファイル:
{"total":"0","current":"0"}
編集1: タイムアウトのヒントをありがとうございますが、Firefoxでは(良好に)機能しています。問題は、PHPの実行を開始した後(3秒ごとにファイルをロードする前)にChromeコンソール内に「XHRのロードが完了しました」という応答がないことです。
編集2: おそらくこの問題の理由は、ユーザーがフォームを送信した後にこのJSONファイルを読み込もうとしたためです。何らかの理由で、フォーム送信後のChromeではjQuery$getJSON関数を実行できなくなったと思います。任意の回避策をいただければ幸いです。