Проблема синхронизации PHP + jQuery - PullRequest
2 голосов
/ 16 июня 2011

Я использую jQuery + PHP на своем веб-сайте и хочу сделать что-то вроде этого:
Для упрощения у меня есть страница с 2 кнопками (), и в соответствии с которой я нажимаю, я хочу запустить скрипт в фоновом режиме (php script), поэтому я делаю простую вещь с jquery:

$("#button1").click(function(){
    $.post("script.php", {val:"but1"}, function(result){
        alert(result); // I want something with the result
    });
});

$("#button2").click(function(){
    $.post("script.php", {val:"but2"}, function(result){
        alert(result);
    });
});

и в файле script.php у меня есть простое выражение if, решающее, что мне делать.
В php-скрипте я загружаю файл и хочу создать индикатор загрузки файла. Скрипт php вернет мне значения (echo percentage; flush();) через некоторый промежуток времени.
И тут возникает проблема - когда я повторяю эти процентные значения и сбрасываю, он обновляет его «только в php», но jquery ждет, пока скрипт не будет завершен в любом случае. Есть ли способ получить эти значения по мере их появления (после сброса) или есть совершенно другой подход к этому? Сейчас я не могу думать ни о чем другом, может, мне вообще не стоит использовать jquery.
Спасибо за помощь.

Ответы [ 4 ]

2 голосов
/ 16 июня 2011

Сценарий ниже будет работать для индикатора выполнения.

Но я хотел бы вызвать AJAX-вызов, чтобы начать загрузку, и вызвать другой AJAX-вызов, чтобы начать прием ввода (используя Как показать прогресс загрузки файла в PHP Shell Scripting? ).

PHP:

<?php
echo "wget '$feedURL'\n";
$execute = "wget -O ".$filePath." '$feedURL'\n";
$systemOutput = shell_exec($execute);
$systemOutput = str_replace( "\n", "\n\t", $systemOutput);
echo "\t$systemOutput\n";
?>

GetProgress:

function getProgress(){
  GDownloadUrl("getprogress.php?progress_key=<?php echo($unique_id)?>", 
               function(percent, responseCode) {
                   document.getElementById("progressinner").style.width = percent+"%";
                   if (percent < 100){
                        setTimeout("getProgress()", 100);
                   }
               });

}

Вот хорошая реализация спомочь PHP APC получить хороший индикатор выполнения при загрузке файла - http://www.haughin.com/2007/10/23/php-upload-progress-with-php-52-apc/

1 голос
/ 16 июня 2011

Вы можете сохранить ход выполнения в текстовом файле или БД во время выполнения сценария, а затем получить другой файл для получения результата с помощью вызовов AJAX.

JS / HTML

<script>
$(function() {
    var id;
    var timeoutLength = 1000;

    $("#button1").click(function() {
        $("#result").html("");

        // Create unique identifier
        id = (new Date().getTime()) + "-" + Math.floor(Math.random()*100);
        $.get("script.php", {id: id}, function(result){
            $("#result").html(result);
        });

        setTimeout(checkProgress, timeoutLength);
    });

    function checkProgress() {
        $.get("script.php", {progress: true, id: id}, function(data) {
            prog = parseInt(data);
            // Display progress bar
            if(prog < 100) {
                $("#progress").css({ display: 'block', width: prog });
                $("#progress").html(prog + "%");

                setTimeout(checkProgress, timeoutLength);
            } else {
                $("#progress").css('display', 'none');
            }
        });
    }
})
</script>
<button id="button1">Click</button>
<div id="progress" style="background: green"></div>
<div id="result"></div>

script.php

<?php

function getProgress($file) {
    return (file_exists($file)) ? file_get_contents($file) : 0;
}

function setProgress($file, $progress) {
    file_put_contents($file, $progress);
}

// Remove invalid characters
$id = str_replace('/[^a-zA-Z0-9\-_]/', '', $_GET['id']);
$file = "progress-" . $id . ".txt";

if(isset($_GET['progress'])) {
    echo getProgress($file);
} else {
    // Do something and update progress
    for($i = 10; $i <= 100; $i += 10) {
        // Do something

        setProgress($file, $i);
        sleep(1);
    }
    unlink($file);
    echo "Result: " . rand(1, 100);
}

Изменить: Добавлена ​​поддержка нескольких запросов и простой индикатор выполнения.

1 голос
/ 16 июня 2011

я считаю, что все, что вам нужно, это пакет pecl uploadprogress

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

РЕДАКТИРОВАТЬ : извините, я не видел упоминания о загрузке, так что посмотрите здесь

0 голосов
/ 16 июня 2011

При условии, что ваш PHP имеет какой-то способ узнать процент прогресса, вы должны сделать несколько запросов на обновления:

function receiveProgress(data) {
    // update progres indicator here
    if (parseFloat(data) < 100) {
        setTimeout(checkProgress, 100);
    } else {
        pressedButton = '';
    }
}

function checkProgress() {
    $.post("script.php", {val:pressedButton}, receiveProgress);
}


var pressedButton = '';
$("#button1").click(function(){
    pressedButton = 'but1';
    checkProgress();
});

При этом сервер будет запрашивать обновления каждые 100 мс

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...