使用xhr进行异步处理,无需等待响应

时间:2013-06-12 01:19:47

标签: jquery ajax

我正在使用jquery表单插件来进行ajax调用并通过ajax上传文件,因为我们需要支持不支持ajax级别2的IE8

由于服务器需要一些时间来处理文件,我想以异步方式进行。

我想知道是否有办法使用ajax提交我的表单,仅用于上传/发送文件而不是等待回复。

我希望ajax发送文件然后关闭连接而不等待服务器的响应,因为它可能需要12到15分钟。它应该只显示一条消息,说明该文件已被上传。

下面是我的代码,但只是删除“success”参数

它不起作用
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', //Div tag where content info will be loaded in
                    url:'lookup_process.php',
                    async:true,
                    beforeSubmit: function() {
                        $('#uploader').html('<img src="/images/ajax-loader.gif" />'); //Including a preloader, it loads into the div tag with id uploader
                        $('input[type=submit]').attr('disabled', true);
                        $('input[type=reset]').attr('disabled', true);
                    },
                    timeout = 120000,
                    success:  function() {
                    //Here code can be included that needs to be performed if Ajax request was successful
                        $('#uploader').html('');
                        $('input[type=submit]').attr('disabled', false);
                        $('input[type=reset]').attr('disabled', false);
                    },
                    error: function(jqXHR, textStatus){
                        if(textStatus == 'timeout')
                        {     
                            $('#uploader').html('');
                            $('input[type=submit]').attr('disabled', false);
                            $('input[type=reset]').attr('disabled', false);
                        }
                    }
                };
                $('#credit').ajaxSubmit(options);
                $('#uploader').html('');
                $('input[type=submit]').attr('disabled', false);
                $('input[type=reset]').attr('disabled', false);
                return false;
            }

2 个答案:

答案 0 :(得分:0)

现在我更好地理解了这个问题,让我再试一次。由于上传速度很快,但处理速度很慢,因此有几种方法可以解决。

选项1:被调用的PHP文件实际上并不处理该文件,而是将其放入队列,可能是数据库或平面文件。然后一个cron作业将每分钟执行一次检查队列中的项目,如果队列有未处理的作业则处理它,一旦完成,它将向用户发送通知。这可以通过轮询,网站套接或电子邮件来完成。

优点:如果这些工作确实是资源密集型的,那么您可能只希望一次运行有限数量的工作。使用队列确保只根据需要处理多个队列,当工作人员可用时,将处理下一组。

缺点:在每个作业中添加1到60秒(等待下一个cron脉冲),需要一个cron任务。

选项2:异步调用PHP代码以便请求返回但将继续在后台处理直到完成。 This page有一些很好的例子说明如何做到这一点。 shell_exec()允许您执行另一个PHP文件,但请求不会等待该文件完成。

优点:无需cron工作。相当容易设置。

缺点:如果10个人一次执行一项需要15分钟才能运行的工作,它会毁掉你的网络服务器吗?

哪个选项最好可能取决于您的环境,负载以及您可用的资源。

答案 1 :(得分:0)

我建议使用以下两种解决方案之一:

  1. 上传文件后,将处理传递给单独的线程。这将允许Web请求返回,而不是等待处理完成。

  2. 将文件保存到磁盘,其中一些其他进程/线程正在轮询要处理的文件,或者将记录插入到其他进程正在观察的任务数据库表中,或者类似的东西。

  3. 我不确定这些选项在php中是多么合理。