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


Best process to handle AJAX file processing on server which takes a long time

我有下面的代码显示一个表单。上传器div部分显示一个gif图像,告诉用户文件正在被服务器处理,而div 'outdata'保存了文件被处理后ajax调用的输出。我的文件需要很长时间才能在服务器上处理,因为它包含了很多信息。假设最后一个文件花费了12.11分钟。

我的问题是,当我上传一个小文件,它工作得很好。响应显示在outdatadiv部分中。然而,当文件大小较大时,似乎服务器输出文件,因为我得到它通过电子邮件发送给我,但浏览器页面不反映相同。显示文件仍在处理中,图像仍在屏幕上。

1)。浏览器等待ajax发送回responsetext需要多长时间是否有更好的方法来做这件事?

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;   
            }

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

提高最大请求时间是一种选择,但这是一个糟糕的选择,因为它会阻塞服务器资源。最好异步处理。

  1. 文件上传成功后,返回Ajax调用的成功码。这也允许您向最终用户提供有用的反馈,告诉他现在可以去喝点咖啡并等待处理。
  2. 生成一个后台作业,或者让cron从队列中取出文件,并开始处理它。
  3. 使用长轮询机制(或websockets,如果你在滚动)打开一个长期的关系到服务器,请求有关进程的更新。这可以是"我是/还没有完成",或者甚至是过程的百分位数更新。当你开始在后台而不是内联做事情时,一切都是可能的。

您可以使用数据库(在上传时插入作业,让处理作业在该表中更新状态)或使用基于普通文件夹的排队系统(上传到/incoming, cron扫描该文件夹并移动到/processing并在完成后删除)来实现该系统。

你的web服务器和他的系统负载将感谢你;)