php离开页面后继续执行

php continue execution after leaving the page

我有一个简单的脚本,它使用 for 循环从 1 计数到 5000。它实时将输出刷新到浏览器并显示带有 %.

的进度条

我有什么:如果我离开页面,进程就会中断。如果我回来,从0开始。

我想要实现的目标:如果我离开页面,进程会继续,如果我回来,它会显示正确的百分比。

示例:我运行这个过程,它计数到54,我离开页面10秒,当我回来时它显示我140并继续刷新。

可能吗?

我建议您使用服务器工作者 - 旨在 运行 独立于网络服务器上下文的脚本。

最常见的实现方式 - 使用消息队列(RabbitMQ、Qless 等)。事件应由 Web 上下文中的脚本发起,但实际任务应由不同上下文中的队列侦听器执行。

你所问的问题似乎很容易用会话来完成。 (纯粹假设给定的用例)。这不是 运行 任何后台进程,它只是简单地跟踪时间并显示进度。这就是为什么我说 "based on what you asked"。如果您想跟踪任何真正的后台任务,那么我相信情况会完全不同,您也必须更改问题的措辞;)

像这样就可以了。

<?php
session_start();
$s = &$_SESSION;

$sleep = 1; //seconds

//check if we have a value set in session before, if not set default = 0.
if(!isset($s['last'])){
    $s['last'] = 0;
}

//check if we have a last time set in session before. if not set a default = curret time.
if(!isset($s['time'])){
    $s['time'] = time();
}

//get the idle time of the user.
$idle = time() - $s['time'];

//start the loop..and set starting point.
$start = $s['last'] + ($idle / $sleep);

for( $i = $start; $i < 100; $i++){
    echo $i . '<br />';
    $s['last']++;
    $s['time'] = time();
    flush();
    sleep($sleep);
}

希望对您有所帮助!!