非同期データ処理用のPHPコンポーネントを探しています。
基本的に必要なのは、一部のデータ処理の進行状況を表示するjavascriptで更新された進行状況バーのあるページを表示することです。
バックエンドで、データプロセスの制限を定義します。これは、個々のアイテムを処理するために呼び出す開始、終了、および関数です。
CMSとフレームワークにはこれに対する解決策がたくさんあります。アプリケーションに含めることができる生のPHPの何かを探しています。
非同期データ処理用のPHPコンポーネントを探しています。
基本的に必要なのは、一部のデータ処理の進行状況を表示するjavascriptで更新された進行状況バーのあるページを表示することです。
バックエンドで、データプロセスの制限を定義します。これは、個々のアイテムを処理するために呼び出す開始、終了、および関数です。
CMSとフレームワークにはこれに対する解決策がたくさんあります。アプリケーションに含めることができる生のPHPの何かを探しています。
少し前に似たようなことをしました。進行状況をJSONオブジェクトとしてテキストファイルに記録する関数を作成しました。次に、jQueryの要求に応じて特定の間隔でそのJSONオブジェクトをブラウザーに返すPHP関数を作成しました。
私のPHPコードは次のようになります。
function logProgress($task, $status, $progress) {
$basedir = "/var/www/" . SITE_ROOT . "/";
$log_file = $basedir . "logs/progress.log";
$logFileContent = file_get_contents($mrp_log_file);
if($logFileContent){
$logFileArray = json_decode($logFileContent, TRUE);
} else {
$logFileArray = array();
}
$logFileArray[$task]=array('task'=>$task,'status'=>$status,'progress'=>$progress);
$logFile = fopen($log_file, 'w+') or error_log("Failed to open progress file $mrp_log_file for writing");
fwrite($logFile, json_encode($logFileArray));
fclose($logFile);
}
データの取得は次のように簡単です。
function readProgressLog() {
//Returns a JSON object stored in the progress log.
$basedir = "/var/www/" . SITE_ROOT . "/";
$log_file = $basedir . "logs/progress.log";
$logFileContents = file_get_contents($log_file);
return $logFileContents;
}
jQueryから、2つのAJAX呼び出しを行います。1つはプロセスを開始するためのもので、もう1つはテキストファイルをポーリングするためのものです。ポーリング呼び出しのJavaScriptは次のようになります。
function updateProgress() {
var data = {
action:'getProgressUpdate'};
var settings = {success: function(json){
var done = false;
if(json!=null) {
//Put your code to update the progress bar here.
//I look for a JSON property called Done to flag the process as completed.
if(json.Done==null) {
var t2 = setTimeout("updateProgress()", 1000);
} else {
clearTimeout(t2);
done = true;
clearProgressLog();
}
} else {
var t2 = setTimeout("updateProgress()", 1000);
}
},
data:data,
cache:false,
type: 'POST',
dataType:"json"};
$.ajax('/ajax/polling.ajax.php', settings);
}
私が気づいたことの1つは、ポーリングAJAX呼び出しがプロセスAJAX呼び出しとは異なるPHPファイルを使用していることを確認する必要があることです。そうしないと、プロセス呼び出しが終了するまでポーリング呼び出しが終了しません。