Ajax прогресс с сессией PHP - PullRequest
0 голосов
/ 20 мая 2010

У меня есть приложение, которое обрабатывает изображения и использует jQuery для отображения прогресса пользователя.
Я делал это с записью в текстовый файл каждый раз, когда изображение обрабатывалось, а затем читал этот статус с помощью setInterval.

Поскольку на самом деле изображения не записываются при обработке (я делаю это в памяти PHP), я думал, что log.txt будет решением, но я не уверен насчет всех fopen и fread. Это склонно к проблемам?

Я пробовал также с PHP-сессиями, но не могу заставить его работать, я не понимаю, почему ..

HTML:

<a class="download" href="#">request download</a>
<p class="message"></p>

JS:

$('a.download').click(function() {

    var queryData = {images : ["001.jpg", "002.jpg", "003.jpg"]};       
    $("p.message").html("initializing...");

    var progressCheck = function() {
        $.get("dynamic-session-progress.php",
            function(data) { 
                $("p.message").html(data); 
            }
        );
    };

    $.post('dynamic-session-process.php', queryData,
        function(intvalId) {
            return function(data) {
                $("p.message").html(data);
                clearInterval(intvalId);
            }
        } (setInterval(progressCheck, 1000))
    );

    return false;
});

process.php:

// session_start();

$arr = $_POST['images'];
$arr_cnt = count($arr);
$filename = "log.txt";

for ($i = 1; $i <= $arr_cnt; $i++) {
    $content = "processing $val ($i/$arr_cnt)";

    $handle = fopen($filename, 'w');
    fwrite($handle, $content);
    fclose($handle);

    // $_SESSION['counter'] = $content;

    sleep(3); // to mimic image processing
}

echo "<a href='#'>download zip</a>";

progress.php:

// session_start();

$filename = "log.txt";
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);

echo $contents;

// echo $_SESSION['counter'];

1 Ответ

2 голосов
/ 20 мая 2010

Что если два клиента обрабатывают изображения одновременно?

Вы можете попробовать добавить session_write_close () между установкой нового статуса в сеансе, чтобы сохранить данные нового сеанса, в противном случае они будут сохранены только после завершения сценария.

Другим решением было бы сохранить статус в memcache или использовать базу данных, возможно разделить статусы с помощью идентификатора пользователя или создать хэш md5 для данных изображения

...