我正在使用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;
}
答案 0 :(得分:0)
现在我更好地理解了这个问题,让我再试一次。由于上传速度很快,但处理速度很慢,因此有几种方法可以解决。
选项1:被调用的PHP文件实际上并不处理该文件,而是将其放入队列,可能是数据库或平面文件。然后一个cron作业将每分钟执行一次检查队列中的项目,如果队列有未处理的作业则处理它,一旦完成,它将向用户发送通知。这可以通过轮询,网站套接或电子邮件来完成。
优点:如果这些工作确实是资源密集型的,那么您可能只希望一次运行有限数量的工作。使用队列确保只根据需要处理多个队列,当工作人员可用时,将处理下一组。
缺点:在每个作业中添加1到60秒(等待下一个cron脉冲),需要一个cron任务。
选项2:异步调用PHP代码以便请求返回但将继续在后台处理直到完成。 This page有一些很好的例子说明如何做到这一点。 shell_exec()
允许您执行另一个PHP文件,但请求不会等待该文件完成。
优点:无需cron工作。相当容易设置。
缺点:如果10个人一次执行一项需要15分钟才能运行的工作,它会毁掉你的网络服务器吗?
哪个选项最好可能取决于您的环境,负载以及您可用的资源。
答案 1 :(得分:0)
我建议使用以下两种解决方案之一:
上传文件后,将处理传递给单独的线程。这将允许Web请求返回,而不是等待处理完成。
将文件保存到磁盘,其中一些其他进程/线程正在轮询要处理的文件,或者将记录插入到其他进程正在观察的任务数据库表中,或者类似的东西。
我不确定这些选项在php中是多么合理。