2013-07-08 88 views
1

我正在对需要很长时间才能运行的PHP脚本进行AJAX调用。现在,假设需要20分钟才能运行。还假设我要么刷新或关闭,然后打开通知电话的网页。我的问题是:页面刷新后的AJAX和PHP

  1. 我的PHP脚本停止运行?

  2. 如果它继续运行,如何在页面刷新后强制响应返回页面?

谢谢。

** * ** * ** * ** * * UPDATE * ** * ** * ** * * * *

有人问我为什么有一个需要很长时间的脚本。我认为这是我的错,没有解释以下几点:

a。此脚本仅适用于网站管理员,并且不适用于大众

b。这个脚本将执行一些繁重的工作,比如数据操作和数据库相关的东西,并且需要很长时间才能运行。

c。我使用的是AJAX,因此我仍然可以返回到主页面,一个微调器显示脚本正在运行,而脚本实际上在后端运行,而回调函数将移除微调器并显示消息成功/失败状态。

+3

“20分钟”严重?? – swapnesh

+0

在完整的单独说明中,您需要知道,默认情况下,PHP会锁定传入请求的会话,因此同一用户的其他请求将被阻止,直到先前的请求释放会话锁定。您还需要知道被阻止的请求不会形成队列,并且它们每个持有锁的顺序都是随机的。如果你要实现一个执行时间很长的PHP页面,我认为你需要知道这一点。 – Mehran

+0

@swapnesh 那么,它需要20分钟。我所做的就是调用ajax函数,并让它调用将执行大量处理的脚本。这就是为什么我使用AJAX的原因,因为它将是一个异步调用,允许我在脚本运行时返回页面。 – Greeso

回答

2

不,它会停止运行。

您应该使用cron作业来运行需要20分钟的脚本。

不要忘记为该页面设置至少20分钟的时间限制!

+0

正确,但我说设计有问题。谁会等20分钟才能在浏览器中获得响应?而且,即使脚本最终发送它,刷新/关闭页面也会使该响应无法访问。 – ElmoVanKielmo

+0

@ElmoVanKielmo使用cronjob,你通常会更新数据库或其他东西,而不是返回一些东西给浏览器。并且通过关闭浏览器可以阻止cron作业!从OP问题' –

+0

'也假设我要么刷新或关闭,然后打开网页',所以不要告诉我关于cron作业的故事(我已经在使用你在我的项目中谈论的场景),因为它不是案件。 – ElmoVanKielmo

2
  • 我的PHP脚本是否停止运行?

是的,如果浏览器断开连接(它将刷新/关闭),PHP将停止执行。您可以使用ignore_user_abort(true)来防止这种情况,但我认为这不是您想要的最佳选择。

  • 如果继续运行,我怎么能强迫一个响应返回页面已经刷新后?

没有,因为连接没有了,没有什么可以发回响应。当ajax调用它作为后台进程调用你的long进程会更合适,并立即返回一个响应,使后台进程工作。您可以使用常规的ajax调用来查询过程是否完成(例如完成时更新数据库)。

docs:但是

的默认行为是为你的脚本将被中止远程客户端断开连接时。

+0

感谢您的输入。如果我的脚本在单独的文件中,它会停止执行吗?我将在不使用ignore_user_abort()的情况下测试此senario; – Greeso

+0

是的,它会默认停止执行。一定要在'ignore_user_abort(true);'中传递'true'。 – MrCode