Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在服务器上处理AJAX文件处理的最佳过程,这需要很长时间_Php_Ajax_Browser - Fatal编程技术网

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

Php 在服务器上处理AJAX文件处理的最佳过程,这需要很长时间,php,ajax,browser,Php,Ajax,Browser,我有下面显示表单的代码。uploader div部分显示一个gif图像,告诉用户服务器正在处理该文件,处理完该文件后,div“outdata”保存ajax调用的输出。我的文件在服务器上处理需要很长时间,因为它携带了大量信息。假设最后一个文件花了大约12.11分钟 我的问题是,当我上传一个小文件时,它工作得非常好。响应显示在outdata div部分。但是,当文件大小较大时,服务器似乎会输出文件,因为我收到了电子邮件,但浏览器页面并不反映相同的内容。它显示文件仍在处理中,图像仍保留在屏幕上 1)

我有下面显示表单的代码。uploader 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>";
echo”“;
echo“文件名:”;
回声“

”; 回声“电子邮件:”; 回声“

”; 回声“; 回声“; 回声“
”; 回声“; 回声“
”; 回声“; 回声“;
这是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;   
            }
函数验证()
{
var file=$(“#file”).val();
如果(!file | | file=''| | file==null)
{
document.getElementById(“outdata”).innerHTML=“请选择一个文件”;
返回false;
}   
变量选项={
目标:“#outdata”,
url:'process.php',
数据:{
访问类型:“cre”
},
提交之前:函数(){
$('#uploader').html('');
$('input[type=submit]').attr('disabled',true);
},
成功:函数(){
$('#uploader').html('');
$('input[type=submit]').attr('disabled',false);
}
};
$('#cre')。ajaxSubmit(选项);
返回false;
}

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

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

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


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

    对不起,我以前从未在服务器上实现过如此繁重的处理。请您再解释一下长轮询,以及如何实现该解决方案。也许一些指南或代码示例会很有帮助。我该怎么做?我对JQuery相当陌生。该文件将上载到我的apache服务器,但它会将其发送到另一台服务器进行处理。如何在处理文件时使用jQuery每10秒发送一次请求,并在生成输出并发送回浏览器后告诉它停止。