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);
}
希望对您有所帮助!!
我有一个简单的脚本,它使用 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);
}
希望对您有所帮助!!