2009-11-01 70 views
14

例如,有一个非常简单的PHP脚本,用于更新数据库中的某些表,但这个过程需要很长时间(可能需要10分钟)。因此,即使用户关闭了浏览器,我也希望此脚本继续处理,因为有时用户不会等待,他们会关闭浏览器或转到其他网页。即使用户关闭浏览器,PHP脚本能否继续运行?

+0

因此,如果我想解除执行作业的浏览器请求,我如何请求另一个php脚本,同时用户的当前请求继续正常。 因此,当用户请求任何网址时,此请求将启动另一个脚本(独立于用户浏览器和其他请求工作)。用户将继续在网站上正常冲浪 – 2009-11-01 22:09:04

+0

好问题兄弟! +1 – 2011-08-31 06:01:27

回答

7

直接回答你的问题,请参见ignore_user_abort

更广泛地说,你可能有一个架构问题就在这里。

如果许多用户可以启动这些东西,那么您会希望Web应用程序将作业添加到某种类型的队列中,并拥有一定数量的后台进程来咀嚼所有工作。

-1

无论客户端在做什么,服务器端脚本都会继续执行。

编辑:顺便说一句,你确定你想要打开10分钟的网页吗?我建议你使用一个任务队列(其项目由cron及时执行)并将用户重定向到“好的,我在上面”页面。

+0

...不完全正确:通常,有警卫“杀死”长时间运行的PHP脚本:这些脚本采取crontab条目的形式。 – jldupont 2009-11-01 21:50:36

+1

并非总是如此:http://php.net/manual/en/function.ignore-user-abort.php – timdev 2009-11-01 21:51:12

+0

@jldupont:我不是php的家伙,但是这些脚本与客户端有什么关系? – shanyu 2009-11-01 21:53:26

3

如果脚本完全基于服务器(没有反馈给用户),即使客户端关闭,也会执行此操作。

PHP的通用体系结构是客户端向脚本发送请求,以向用户提供答复。如果没有返回给用户,即使用户不在另一边,脚本仍然会执行。更简单一点:在常规脚本中,它们在服务器和客户端之间没有固定的连接。

+1

注意总是对的:http://php.net/manual/en/function.ignore-user-abort.php – timdev 2009-11-01 21:50:13

1

您可以使用包含时间和运行命令的crontab文件每20分钟运行一次PHP脚本,在这种情况下,它将是php脚本。

+0

这是除了在这里问的问题... – jldupont 2009-11-01 21:49:37

0

是的。服务器不知道用户是否关闭了浏览器。至少它没有立即注意到。

否:服务器可能(取决于它的配置方式)不允许php脚本运行10分钟。在廉价的共享主机上,我不会依赖运行时间超过合理响应时间的脚本。

15

如果任务需要10分钟,请不要使用浏览器直接执行它。您有许多其他选项:

  • 使用cronjob定期执行任务 。
  • 让浏览器 请求插入新行到 数据库表,以便定期 的cronjob可以处理新行和 与 适当的参数
  • 有 浏览器请求写的消息执行PHP脚本到 队列系统,其具有用户 监听这样的事件(然后 执行脚本)。

虽然其中一些建议可能是矫枉过正您的具体情况,关键,结合特点是取消夫妇从作业的执行浏览器请求,以便它可以异步完成。

如果您需要浏览器窗口随进度一起更新,则需要使用定期执行的AJAX请求来检索作业状态。

+1

+1为我的答案更好,更具体的版本。 – timdev 2009-11-01 21:58:39

+0

所以如果我想解除执行作业的浏览器请求,我怎么能请求另一个php脚本,而用户的当前请求继续正常。所以,当用户请求任何url时,这个请求将启动另一个脚本(它独立于用户浏览器和其他请求)。用户将继续在网站上正常冲浪 我该怎么做? – 2009-11-01 22:09:56

+0

查看这些要点?这些都是做到这一点的方法。在大多数情况下,设置一个保存后台进程输入的小数据库表格可以正常工作。然后,您可以启动一些PHP脚本来执行作业,通过cron或其他方法。 – timdev 2009-11-01 22:19:11

4

PHP脚本将在客户端终止连接后继续运行(不这样做会带来安全风险),但最多只能到max_execution_time(在php.ini中设置或通过PHP脚本设置,默认通常为30秒) ..

例如:

<?php 
    $fh = fopen("bluh.txt", 'w'); 
    for($i=0; $i<20; $i++) { 
     echo $i."<br/>"; 
     fwrite($fh,$i."\n"); 
     sleep(1); 
    } 
    fclose($fh); 
?> 

开始运行在浏览器中并关闭浏览器完成之前。您会发现20秒后该文件包含$i的所有值。

将for循环的上限更改为100而不是20,并且您会发现它仅从0运行到29个。由于PHP的max_execution_time脚本超时并死亡。

相关问题