0

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

由于服务器需要一些时间来处理文件,我正在考虑异步进行。

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

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

下面是我的代码,但它不能通过删除“成功”参数来工作

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

2 回答 2

0

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

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

优点:如果这些工作真的是资源密集型的,你可能只希望一次运行有限的数量。使用队列可确保只处理您希望的数量,下一组将在工作人员可用时处理。

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

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

优点:不需要 cron 作业。相当容易设置。

缺点:如果 10 个人同时执行一项需要 15 分钟才能运行的工作,它会破坏您的网络服务器吗?

哪个选项最好取决于您的环境、负载和可用资源。

于 2013-06-12T01:29:47.320 回答
0

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

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

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

我不确定这些选项在 php.ini 中的合理性如何。

于 2013-06-12T02:15:14.840 回答