、は長い実行時間を持つPHPスクリプトはつまり、私は質問のいくつかの上に見えたブラウザ
- Show progress for long running PHP script
- How do you run a long PHP script and keep sending updates to the browser via HTTP?
に戻って更新を送信することを可能にし、どちらもが答えているようです私の質問、その一部は「私はどうやってこれをするのですか?」と思われます。残りの半分は「ちょっと、私が今やっているやり方 - これが最善の方法でしょうか?
私は、PHPスクリプトへの上にいくつかのデータを送信し、簡単なAjaxのスクリプトを持っている:
$.ajax({
type: 'POST',
url: 'analysis.php',
data: { reportID:reportID, type:type, value:value, filter_type:filter_type, filter_value:filter_value, year:year },
success:function(dataReturn){
analysis_data = JSON.parse(dataReturn);
/* do stuff with analysis_data... */
});
それがデータベースをループし、いくつかの非常に複雑なクエリを実行すると、このPHPスクリプトは、実行するのに約3分かかります。
<?php
session_start();
ob_start();
ini_set('max_execution_time', 180);
$breaks = [ 1000, 2000, 4000, 6000, 8000, 10000, 20000, 50000, 99999999 ];
$breaks_length = count($breaks);
$p = 0;
foreach ($breaks as $b) {
$p++;
$percentage_complete = number_format($p/$breaks_length,2) . "%";
$sql = "query that takes about 20 seconds to run each loop of $b....";
$query = odbc_exec($conn, $sql);
while(odbc_fetch_row($query)){
$count = odbc_result($query, 'count');
}
$w[] = $count;
/* tried this... doesn't work as it screws up the AJAX handler success which expects JSON
echo $percentage_complete;
ob_end_flush();
*/
}
echo json_encode($w);
?>
本の全作品 - しかし、彼らが働いて、それを見ることができるように、私が本当にしたいことは戻ってユーザに出力$percentage_complete
に、各foreach
ループの後の道を見つけるされ、代わりにちょうどのためにそこに座ってのFontAwで2分彼らの目の前で回転する夢のアイコン。私はob_start();
を使用してみました、だけでなく、ページが動作して行われるまで出力されません何もない、それはそれは台無しにさせ、私のAJAXの成功ハンドラに送り返されるものの一部である値を、エコー。 (私はJSON_encoded形式で出力する必要があります。
私が読んだスレッドでは、唯一の考えは前のページで$breaks
の配列ループを開始することです同じページに6回ループし、Iループ一度、答えを返し、その後、$breaks
配列の2番目の要素を使用して再度analysis.php
を呼び出すが、私は、これは物事を行くための最善の方法であるか分かりません。また
- このスクリプトを実行するためには、ユーザが待っていることを3分の間に、彼らはページ上の何かを行うことはできませんので、彼らはただ座って待たなければなりません。私は、このスクリプトを実行してユーザーのサーバーの残りの部分を「ロックダウン」しない方法があると確信していますが、私がGoogleで検索したすべてが私に良いこれは私が正確に何を検索するのか分かりません...
あなたは右、($ percentage_complete)json_encodeをしましたか?あなたは "do_stuff"以外のJSコールバックに何も持っていませんか? –
通常、コールバックはそれに戻って渡されるものは何でも解析し、あなたがフィードバックを表示することがしたかったページ上のいくつかの要素のinnerHTMLプロパティに代わる.... –
疑問があること、実際のJSONレスポンスを処理する方法に関するものではありませんPHPページが成功の呼び出しに戻ってきています。これは、成功の呼び出しで実行するコードの長い部分です。うまくいきます。そして@Kkinsey、私はとして出力しようとした - 質問は、スクリプトは、彼らが「リアルタイム」で起こって進行状況を確認できるよう、ユーザーに何かを返すために、実行中の処理中に、私のためにどのような方法があるかどうかではありませんJSON - と私はそれが仕事を得ることができながら、スクリプトが完全に終了していたまで、それは何も出力しませんでした(私には無意味である...) –