PHP решение для массовой обработки - PullRequest
0 голосов
/ 19 марта 2012

Я ищу компонент PHP для асинхронной обработки данных.

По сути, мне нужно отобразить страницу с индикатором выполнения, который обновлен с помощью JavaScript, который отображает ход обработки некоторых данных.

На бэкэнде вы определите свой лимит обработки данных.Это начало, конец и функция для вызова для обработки отдельных элементов.

Существует множество решений для этого в CMS и средах.Я ищу что-то в сыром PHP, которое я могу включить в свое приложение.

1 Ответ

0 голосов
/ 19 марта 2012

Я сделал нечто подобное не так давно.Я написал функцию, которая записывает прогресс в текстовый файл как объект JSON.Затем я написал функцию PHP, которая возвращает этот объект JSON в браузер через определенные промежутки времени, как того требует jQuery.

Мой 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 опроса используется файл PHP, отличный от вызова процесса AJAXв противном случае ваш опрос не завершится, пока не завершится вызов процесса.

...