Ajax调用长PHP任务

时间:2016-08-13 21:01:10

标签: php jquery ajax

我需要从Ajax执行一个很长的(10-60秒)PHP任务。此外,调用页面需要关闭连接并转到新页面,PHP任务在后台完成。

起初我尝试了这种情况:

$.ajax({
   url: '/ff.php',  
   type: 'POST'
}).success(function(response) { 
   console.log("... returned");
});
window.top.location.href = "http://yahoo.com";      

但是我从未按照我的想法执行ff.php。不知何故,它在调用Ajax之前进入新页面......或者在执行之前由于新页面而关闭了连接。尽管我认为我需要在ff.php中采取预防措施:

ignore_user_abort(true);
ob_end_clean();
header("Connection: close");
ignore_user_abort();  
ob_start();
echo ('Text the user will see');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();  
flush();             
// Do processing here 

session_write_close();

sleep(30);

require_once($_SERVER['DOCUMENT_ROOT'].'/ajax/lib/sendPush.php');

我已经看过很多帖子,那些顶级代码块是让PHP返回控制到调用者所需要的东西,但我不能让它在这种情况下工作 - 我怀疑是因为我在移动到一个新的页面。最后一个require语句向我的iPhone上的应用程序发送推送通知,这听起来很好。我使用它来知道我的PHP脚本已经执行,并且当它工作时它将成为我的生产环境的一部分。

我还尝试将新页面URL移动到Ajax成功块中,如下所示,因为我认为PHP具有立即返回所需的所有代码。

$.ajax({
   url: '/ff.php',  
   type: 'POST'
}).success(function(response) { 
   console.log("... returned");
   window.top.location.href = "http://yahoo.com"; 
});

但在这种情况下,在进入下一页之前需要整整30秒。

所需的结果是:执行PHP,立即接收推送,页面快速进入下一页。 但到目前为止我要么接下来页面立即,没有执行ff.php或者它执行但浏览器等待整整30秒才能进入下一页。

更新:正如一位评论者在下面说的那样“基本上如果您在回复之前重定向,那么您的ajax电话将被取消。” ...所以我的后续问题是这个...有没有办法知道Ajax何时被收到并开始执行,所以我可以在那时进行重定向?我查看了Ajax事件,它们似乎只与执行完成时有关。这是否意味着无法通过jQuery处理长ajax调用?我们必须使用队列吗?

3 个答案:

答案 0 :(得分:1)

尝试这样的事情:

$.ajax({
   url: '/ff.php',  
   type: 'POST'
}).success(function(response) { 
   console.log("... returned");
});
$('#status').text("I'm redirecting you to a new page...");
setTimeout(function(){window.top.location.href = "http://yahoo.com";},1000);  //Put some delay between ajax and redirect

答案 1 :(得分:0)

基本上,如果您在回复之前重定向,那么您的ajax呼叫将被取消。

您应该寻找替代方案,例如您可以调用ajax请求来安排长时间运行的任务。

即使你找到了破解它的方法并使其发挥作用,这也不是一个好主意,你永远不会知道请求是否成功。

因此,如果您运行linux或Windows Server的任务计划程序

,请使用cron任务

答案 2 :(得分:0)

根据ignore_user_abort的文档,你应该传递true作为参数,所以我会在你想要的时候运行。 编辑:我没注意到它已经存在了。

一旦通过AJAX调用PHP函数,应运行直到用户中止处理结束(或关闭AJAX连接)。

当然,您还需要设置set_time_limit来延长脚本的执行时间。