我有一个可以运行几分钟的While循环(功能),有时可能需要10分钟,有时需要30分钟。
我不想让用户等待网页窗口打开30分钟,我想让用户关闭窗口并让循环自行继续。
我希望用户打开网页点击按钮启动该功能,然后关闭页面,让功能自行运行。
有可能有任何可能吗?
答案 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无法查找任何新线程,会发生什么?
发生错误或需要重试处理时会发生什么?