-1

我正在寻找用于异步数据处理的 PHP 组件。

基本上我需要的是显示一个带有进度条的页面,该进度条用javascript刷新,显示一些数据处理的进度。

在后端,您将定义数据处理限制。这是调用处理单个项目的开始、结束和函数。

在 CMS 和框架上有很多解决方案。我正在寻找可以包含在我的应用程序中的原始 PHP 内容。

4

1 回答 1

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 文件,否则轮询调用在进程调用完成之前不会完成。

于 2012-03-19T19:42:57.897 回答