在服务器上处理AJAX文件处理的最佳过程需要很长时间

时间:2013-06-05 01:14:49

标签: php ajax browser

我有以下代码显示表格。上传器div部分显示一个gif图像,告诉用户服务器正在处理文件,div'outdata'保存文件处理后ajax调用的输出。我的文件需要很长时间才能在服务器上处理,因为它会在其中传递大量信息。让我们说最后一个文件花了大约12.11分钟。

我的问题是,当我上传一个小文件时,它的效果非常好。响应显示在outdata div部分中。然而,当文件大小更大时,似乎服务器输出文件,因为我通过电子邮件发送给我,但浏览器页面不反映相同。它显示文件仍在处理,图像保留在屏幕上。

1)。浏览器等待ajax发送回responsetext的时间长短 2)。有更好的方法吗?

echo "<form name=\"cre\" id=\"cre\" action=\"#\" method=\"post\" enctype=\"multipart/form-data\">";
    echo "<label for=\"file\">Filename: </label>";
    echo "<input type=\"file\" name=\"file\" id=\"file\" ><br><br>";
    echo "<label for=\"email\">Email: </label>";
    echo "<input id=\"email\" type=\"text\" name=\"email\" maxlength=\"40\"><br><br>";  
    echo "<input type=\"submit\" onclick=\"return validate();\" id=\"submit\" value=\"Submit\">&nbsp;&nbsp;";
    echo "</form>";
    echo "<BR>";
    echo "<div id=\"uploader\"></div>";
    echo "<BR>";
    echo "<div id=\"outdata\">";
    echo "</div>";

这是ajax电话

function validate() 
            {
                var file = $("#file").val();
                if(!file || file == '' || file == null)
                {
                    document.getElementById("outdata").innerHTML="Please select a file";
                    return false;
                }   
                var options = {
                    target: '#outdata',
                    url:'process.php', 
                    data:{
                        accesstype:"cre"
                    },
                    beforeSubmit: function() {
                        $('#uploader').html('<img src="/images/ajax-loader.gif" />');
                        $('input[type=submit]').attr('disabled', true);
                    },
                    success:  function() {

                        $('#uploader').html('');
                        $('input[type=submit]').attr('disabled', false);
                    }
                };
                $('#cre').ajaxSubmit(options);
                return false;   
            }

1 个答案:

答案 0 :(得分:3)

这是您遇到的服务器端超时,而不是客户端。您还没有在Ajax调用中实现error处理程序,因此它没有看到Apache(及其同类)在30或60秒后自动终止请求(可在apache2.conf中配置)。 / p>

提高最长请求时间是一个选项,但是一个坏选项,因为它会阻塞服务器资源。最好以异步方式处理它。

  1. 成功上传文件后,将成功代码返回给Ajax调用。这也允许您向最终用户提供有用的反馈,说他现在可以去喝咖啡并等待处理。
  2. 产生一个后台作业,或者让一个cron拿起队列中的文件,然后开始处理它。
  3. 使用长轮询机制(如果您正在滚动,则使用websockets)打开与服务器的长期关系,请求有关该过程的更新。这可以是“我是/未完成”,甚至是过程中的百分比更新。当你开始在后台做事而不是内联时,一切皆有可能。
  4. 您可以使用数据库(在上载时插入作业,让该表中的处理作业更新状态)或使用基于文件夹的普通排队系统(上传到/incoming来实现系统,cron扫描文件夹并移至/processing并在完成后删除。

    您的网络服务器及其系统负载将会感谢您;)