0

希望可以有人帮帮我。

我有一个将变量传递给 php 文件 (thumbs.php) 的 ajax 脚本 (index.php)。

php 文件从原始图像生成缩略图并将它们存储在服务器上。此过程可能需要相当长的时间才能完成(最多 10 分钟)。

在这个过程进行的同时,我有一个覆盖层告诉用户等待。这一切都很好。

但是,一旦 php 脚本返回“true”(即完成),覆盖应该会消失。

问题:覆盖并没有消失。我可以在 Firebug 中看到 index.php 不等待 thumbs.php 的响应。它总是在 1-1.5 分钟左右超时。我不知何故需要保持连接打开。

... more code here
    (function worker() {
        $.ajax({
            url: 'thumbs.php',
            type: 'POST',
            dataType: 'json',
            data: dataPass,
            beforeSend: function(){
                $('.overlay').show();
                $('.result').show();
                $('.resultText').html("<center>Please wait whilst we create thumbnail images for this folder.<br><br>This is a one time operation.<br><br>Please be patient.</center>");
            },
            success: function(data){
                $.each(data, function(i, obj){
                alert(obj.count); // THIS should return true when finished
                });
            },
            complete: function() {
                $('.overlay').hide();
                $('.result').hide();
            }
        });
    })();       
...more code here   

编辑:

好吧,我还有一点!

脚本现在可以正常循环,但永远不会停止!clearTimeout(timer) 不会清除,即使两个警报框显示相同的 id。

任何更多的帮助非常感谢!

(function poll(){
var timer = 0;
var timer = setTimeout(function(){
alert("timer 1: " + timer);
$.ajax({
    url: 'thumbs.php',
    type: 'POST',
    dataType: 'json',
    data: dataPass,
    success: function(data){
        $.each(data,function(i,j){
            reply = j.count;
        });

        if(reply == 'true'){
            alert("timer 2: " + timer);
            clearTimeout(timer);
            $('.overlay').hide();
            $('.result').hide();
        }
    },
    complete: function(){
        poll();
    }
});
},3000);
})();

更多编辑:

好吧,我可以看到我的问题。这段代码

 if(reply == 'true'){
        alert("timer 2: " + timer);
        clearTimeout(timer);
        $('.overlay').hide();
        $('.result').hide();
    }

在 setTimeout 内运行,因此计时器永远不会被清除。因此,整个代码永远运行。解决方案是什么?

4

2 回答 2

1

您正在运行 PHP 的 max_execution_time 或 Web 服务器的请求超时,并且该进程可能在完成之前被终止。无论哪种方式,我都建议您考虑更改您的体系结构以实现一个简单的队列/调度器系统,该系统可以添加作业、检查作业状态并执行作业。然后,您的 ajax 可以使用 setInterval 每 10 秒轮询一次以询问“jobId 完成了吗?” 并在答案为真时关闭覆盖。你真的不想让恶意的人堆积多个 10 分钟的工作。

于 2015-06-22T16:38:25.567 回答
0

增加 PHP 超时限制应该可以解决这个问题。我的建议?不要那样做。有时(例如共享主机)你甚至不能,呵呵。

我建议在这里稍微改变一下方法。特别是,我的方法是对 PHP 函数进行一些轮询,以检查缩略图是否已经生成,并且仅在该函数返回 true 时中止“请等待屏幕”。

换句话说,您将有一个定期(例如每 10 秒)触发的 Ajax 请求,询问此 PHP 函数是否完成缩略图处理,并根据结果保留或中止“请等待屏幕”。

也许有人想出了一个更复杂(但也更复杂)的解决方案,比如使用套接字或类似的东西,但我的建议对于这个用例来说似乎已经足够了。

编辑:我完全忘了提到你需要你的服务器端缩略图生成过程是异步的,这样解决方案才能有效,这可能会导致你使用PHP 线程。对于简单的用例,它们非常简单。

于 2015-06-22T16:36:50.007 回答