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

标签 php ajax browser

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

我的问题是,当我上传一个小文件时,它工作得很好。响应显示在 outdata div 部分中。但是,当文件大小较大时,似乎服务器会输出该文件,因为我将其通过电子邮件发送给我,但浏览器页面并不反射(reflect)相同的情况。它显示文件仍在处理中并且图像保留在屏幕上。

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

最佳答案

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

增加最大请求时间是一种选择,但不是一个好选择,因为它会阻塞服务器资源。最好异步处理这个问题。

  1. 文件成功上传后,向 Ajax 调用返回成功代码。这还允许您向最终用户提供有用的反馈,让他现在可以去喝杯咖啡并等待处理。
  2. 生成一个后台作业,或者让 cron 选取队列中的文件,然后开始处理它。
  3. 使用长轮询机制(如果您工作顺利,则使用 websocket)来建立与服务器的长期关系,请求有关流程的更新。这可以是“我是/未完成”,甚至是流程的百分位数更新。当您开始在后台而不是内联执行操作时,一切皆有可能。

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

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

关于php - 在服务器上处理需要很长时间的 AJAX 文件的最佳流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16930028/

相关文章:

php - jquery实时更新数据库中的行

delphi - 在 WebBrowser 控件上禁用 Ctrl+P(打印)

firefox - 如何检测到用户将文件夹(而不是文件)拖到浏览器中?

css - 奇怪的 iPad 浏览器 Quirk/CSS 问题

php - 如何使用 jquery 对 php 文件进行 onclick ajax 调用?

php - 如何使用 HttpURLConnection 在 php 中发送 json 以读取 'php://input'?

javascript - Node.js - jQuery。从服务器获取PDF并在前端显示

php - 如何将图像剪切到网页中

PHP难以理解的控制流程

asp.net-mvc - 异步 Asp.Net MVC Controller 方法?