2011-05-09 66 views
1

jQuery.ajax()是“请求结束时调用的函数”。假设我正在做一个Ajax请求ajax.php:什么时候jQuery.ajax()完成{}?

<?php 

echo 'complete'; 

some_functions_that_echo_nothing(); 

?> 

将完整必须等待some_functions_that_echo_nothing()?如果是这样,是否有办法让完整的{}直接在echo之后出现,并且仍然让ajax.php一直运行到最后?

+0

只需结束HTTP响应。 – Raynos 2011-05-09 20:32:15

+0

是的,请求一直持续到PHP脚本执行结束。 – 2011-05-09 20:48:50

回答

2

尝试调用HttpResponse::send();

+0

我不知道HttpResponse是如何工作的。它只是返回响应并保持脚本继续?这对我来说似乎很奇怪。不会持有你的Apache线程。所以这会降低服务器的性能? – Eduardo 2011-05-11 01:11:47

+1

@eduardocereto。服务器接受一个包含所有数据的HTTP请求。然后你开始写回应。 'echo'基本上是'HTTPResponse :: write()'。当您发送HTTP响应时,您将HTML直接发送回客户端。然后你可以继续做一些处理。一旦你到达文件的末尾,你的处理应该停止。所有这一切都是提前发回页面,然后正常。 – Raynos 2011-05-11 08:01:14

+0

Apache线程怎么样? – Eduardo 2011-05-11 18:07:15

2

我猜你要输出“完成”,并让背景功能运行,因为它是非常缓慢的。

在这种情况下,把这个功能放在一个单独的文件中。让它成为proc.php并用这个代替:

<?php 
    echo "Complete'; 
    exec ("/usr/bin/php proc.php >/dev/null &"); 
?> 

这将立即返回并触发proc.php文件在后台运行。当然,它不能输出它返回给用户,所以它应该在用户完成时邮寄给用户,或者做他自己的持久性。

编辑ALWAYS采取格雷亚照顾你把里面exec语句。如果您不是100%确定您正在非常仔细地对其进行消毒,请勿将用户输入放入其中。即使如此,您确实没有充分的理由将用户输入用于拨打exec

+0

是否有任何理由将此用于Raynos的方法。我认为尽可能避免系统调用 – babonk 2011-05-09 22:19:13

+0

对于我来说,结束页面处理并开始一项新工作仅仅是为了完成这项任务,我感觉更自然。这只是一个简单的回应,可能不是解决问题的最佳方案。 – Eduardo 2011-05-11 01:13:01

+1

更好的方法是避免sys调用,并将任务添加到队列中,并有一个作业在cron上运行并从队列中取出作业。 – Eduardo 2011-05-11 01:13:59

相关问题