离开页面后php继续执行

Posted

技术标签:

【中文标题】离开页面后php继续执行【英文标题】:php continue execution after leaving the page 【发布时间】:2018-09-10 11:39:19 【问题描述】:

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

我所拥有的:如果我离开页面,进程就会中断。如果我回来,它从0开始。

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

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

有可能吗?

【问题讨论】:

你必须让任务在一个完全独立的进程中运行,例如通过cron作业或其他东西。网页脚本仅用于监控进度。 我猜有一个会话是可能的。 @ADyson 但是如果我使用 cron job ,我如何在另一个监视执行的页面中捕获它的当前百分比? 好吧,作业必须定期在某处写入当前状态,例如进入文本文件或数据库表或其他东西。然后网页可以定期从那里读取它。 【参考方案1】:

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

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

【讨论】:

有趣.. 所以如果使用那些队列监听器,我是否能够在另一个页面中捕捉他们的进度并显示正确的百分比,即使离开页面? @DregKorig,工人可以修改可以被网络脚本读取的状态。例如更改 Redis 或 DB 中的计数器。【参考方案2】:

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

这样就可以了。

<?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);

希望对你有帮助!!

【讨论】:

我认为,其目的不是改变计数器的值,而是即使用户关闭选项卡也要执行任务。 是的,这就是我在回答中提到的。

以上是关于离开页面后php继续执行的主要内容,如果未能解决你的问题,请参考以下文章

JS+PHP实现登录后自动执行之前的操作

离开页面后文件上传不应停止

如何让exec自己运行,php页面继续运行,让PHP不再阻塞

在Xamarin.Forms应用程序中离开页面后,Webview不会关闭

JS图片滚动怎么让鼠标放在图片上后停止滚动,离开继续?

javascript刷新页面后继续运行,不从头执行