2012-03-19 106 views
-1

我正在尋找用於異步數據處理的PHP組件。PHP批量處理解決方案

基本上我需要的是顯示一個頁面的進度條,用JavaScript刷新顯示一些數據處理的進度。

在後端,您將定義您的數據處理限制。這是調用處理單個項目的開始,結束和功能。

在CMS和框架上有很多解決方案。我正在尋找原始PHP中的某些東西,這些東西可以包含在我的應用程序中。

+0

看看我的這個答案,以防萬一它可以幫助你:http://stackoverflow.com/questions/9062078/asychronous-php/9062164#9062164 – xbonez 2012-03-19 18:14:19

+0

你可以給你一個什麼樣的信息的例子處理? – 2012-03-19 18:22:31

+0

謝謝你讓我們知道。我希望你找到你正在尋找的東西! – 2012-03-19 18:46:03

回答

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文件,否則你投票直到進程調用完成後,調用纔會結束。

+0

我對我的代碼塊中的格式表示歉意。我仍然習慣了Stack Exchange的UI。 – chapkom 2012-03-19 19:45:27

+0

感謝您的回答,我可以從您的代碼中獲得一些想法。我將在前面使用jQuery UI進度條,並考慮將進度變量存儲在PHP會話中而不是文件中。如果多個批處理進程同時發生,也可以將批處理ID分配給進程。 – Flupkear 2012-03-20 14:03:31