我正在寻找用于异步数据处理的PHP组件。
基本上我需要的是显示一个带有进度条的页面,该进度条用javascript刷新,显示一些数据处理的进度。
在后端,您将定义数据处理限制。这是要求处理单个项目的开始,结束和功能。
CMS和框架上有很多解决方案。我在原始PHP中寻找可以包含在我的应用程序中的东西。
答案 0 :(得分:0)
我不久前做过类似的事。我编写了一个函数,将进度记录为文本文件作为JSON对象。然后我写了一个PHP函数,它按照jQuery的要求以一定的时间间隔将JSON对象返回给浏览器。
我的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中,您将进行两次AJAX调用,一次启动您的进程,另一次调查文本文件。我的轮询电话的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);
}
我注意到的一件事是你应该确保你的轮询AJAX调用使用的是与你的进程AJAX调用不同的PHP文件,否则你的轮询调用将不会完成,直到进程调用结束。