强制代码在页面关闭后继续运行

时间:2013-02-15 09:11:21

标签: php

我有一个可以运行几分钟的While循环(功能),有时可能需要10分钟,有时需要30分钟。

我不想让用户等待网页窗口打开30分钟,我想让用户关闭窗口并让循环自行继续。

我希望用户打开网页点击按钮启动该功能,然后关闭页面,让功能自行运行。

有可能有任何可能吗?

6 个答案:

答案 0 :(得分:3)

您可以查看fastcgi_finish_request()。它允许你的脚本继续运行但是#34;挂断"与浏览器的连接。当然应该谨慎使用它,否则你可能会冒着在半背景中运行许多进程的风险。

当然,这只适用于php-fpm。否则你会看到像gearman这样的东西,基本上是任何类型的任务调度程序。

答案 1 :(得分:2)

如果脚本超时(max_execution_time中的php.ini设置)对您没有问题,您可以使用 ignore_user_abort(true)

但通常这种任务的更好解决方案是在后台生成它们。您可能会对 Gearman 扩展程序或exec的不同变体感兴趣。

答案 2 :(得分:0)

用户操作不会导致脚本停止。

脚本将继续运行直到它完成或达到超时(在大多数服务器上它是15或30秒),所以如果你有自己的服务器或没有超时的私有服务器,你的脚本将运行30分钟,用户没有对它的影响。

您应该关注的是 - 如果用户刷新页面或在时间范围内再次访问,则不要让脚本再次运行。

答案 3 :(得分:0)

function execInBackground($cmd) { 
    if (substr(php_uname(), 0, 7) == "Windows"){ 
        pclose(popen("start /B ". $cmd, "r"));  
    } 
    else { 
        exec($cmd . " > /dev/null &");   
    } 
} 

或者db + cron解决方案。

答案 4 :(得分:0)

我过去做过类似的事情。

class Task {
  function add($command)
  function execute();
}

class TaskManager {
  function run(){
    $task->execute();
  }
}

任务被添加到队列(DB,flatfile,刻在石头上,无论你喜欢什么)作为脚本或shell命令。然后TaskManager作为服务运行(http://php.net/manual/en/function.pcntl-fork.php处的一些好注释)并继续从队列中取出第一个项目并执行它。

通过这种方式,您可以在后台为长时间运行的任务提供服务,并且您没有开始大量的恶意流程。

答案 5 :(得分:0)

我认为你需要重新思考为什么你在这样的前端运行这么长的进程。为什么不将工作队列放在适当的位置,然后让后台守护程序或服务进程尽可能快。

如果很多人有开放进程并且php无法查找任何新线程,会发生什么?

发生错误或需要重试处理时会发生什么?