0

我有一个处理图像并使用 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;
});

进程.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>";

进度.php:

// session_start();

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

echo $contents;

// echo $_SESSION['counter'];
4

1 回答 1

2

如果两个客户端同时处理图像怎么办?

您可以尝试在设置会话中的新状态之间添加 session_write_close() ,以便存储新的会话数据,否则只有在脚本完成后才会存储它。

另一种解决方案是将状态保存在 memcache 中或使用数据库,可能使用用户 ID 分隔状态或在图像数据上创建 md5 哈希

于 2010-05-20T19:07:44.310 回答