【问题标题】:Is it possible to have a countdown timer run on the server hosting a webpage?是否可以在托管网页的服务器上运行倒数计时器?
【发布时间】:2019-01-01 01:38:01
【问题描述】:

我正在为我的家庭自动化系统开发一个网页,该系统将控制我的花园洒水器。我已经有一个预定的计时器设置,现在我想添加一个倒数计时器(打开 x 分钟)。

我希望能够关闭网页,并让计时器在后台继续运行。当计时器结束时,我希望它在它达到零的那一刻做一些事情,即使没有打开网页。

考虑到这一点,我对网页的有限了解告诉我计时器应该在服务器上运行(在我的例子中是 RPi 上的 Appache2)。我已经尝试过this 基本示例,它在某些方面有效,但本身并没有止于零。

我稍作改动以显示此问题:

<?php

session_start();

if (!isset($_SESSION['countdown'])) {

    $_SESSION['countdown'] = 10;

    $_SESSION['time_started'] = time();
}

$now = time();

$timeSince = $now - $_SESSION['time_started'];

$remainingSeconds = ($_SESSION['countdown'] - $timeSince);

echo "Time remaining: $remainingSeconds seconds";

if ($remainingSeconds < 1) {
    echo "DONE";
    session_destroy();
}

?>

启动脚本,网页显示“剩余时间:10 秒”。完美的。 5 秒后刷新,显示“剩余时间:5 秒”。再次,完美。但是,如果我等待十秒钟并刷新,它会显示“剩余时间:-5 secondsDONE”。清楚地表明脚本仅在页面刷新时运行,这当然是有道理的。

所以我正在寻找的是一个倒数计时器:

  • 在服务器上运行;
  • 可以在达到零时触发事件;
  • 可以从 javascript 或 jQuery 启动、暂停、停止和读取。

我不是在寻找任何特定语言的解决方案,只要它有效,我就很高兴。 PHP 示例只是我在研究我想要实现的选项时偶然发现的。

这样的事情可能吗?

【问题讨论】:

  • 嗯,不是真的... PHP 预处理您的代码,并将其发送到浏览器 - 它不是 PHP 和浏览器之间的交互关系
  • 也许我应该补充一点,我不是在寻找特定于 php 的解决方案。就像我说的,我对所有与网页相关的东西都很陌生,所以这只是我想到的第一件事。任何语言都适合我。
  • 好的,将我评论中的“PHP”替换为“服务器端代码”
  • 您可以将预定的日期/时间存储在数据库中,然后每分钟运行一个脚本(任何语言,可以是 PHP CLI)作为服务器上的 cron 作业,检查时间是否已过,触发所需的操作。您可以从 PHP 读取相同的数据库以显示浏览器中的剩余时间。

标签: javascript jquery html timer webpage


【解决方案1】:
//here is the solution you can check   
<?php
if (isset($_POST['submit'])){
$time = $_POST['time'];
?>
< div id="countdown"></div>
<script type="text/javascript">
    var iTime = <?php echo $time; ?>;
    function countdown()
    {                
        var i = setInterval(function(){
            document.getElementById("countdown").innerHTML = iTime;
            if(iTime==0){
                alert('Countdown timer finished!');
                clearInterval(i);
            } else {
                iTime--;
            }                   
        },1000);                        
    }           
    countdown();
</script>
<?php
        } else {
       ?>
         <form name="test" method="post">
             Enter time: <input type="text" name="time" />
             <input type="submit" name="submit" value="Submit" />
          </form>        
      <?php
     }
        ?>

【讨论】:

  • 这不允许关闭浏览器,但仍然比手动刷新要好;)
【解决方案2】:

您的脚本仅在请求到达处理时运行。

意思是:

  • 当您启动时,它会运行一次,并设置会话的值。

  • 运行一次,5秒后刷新页面,写入,剩余5秒。

  • 它运行一次,当您再过 10 秒刷新页面时,这一次倒计时结束。所以它写“完成”。

但是 PHP 在这些刷新中什么都不做。

关注问题:你想启动一个进程,当你打开网页时(你向服务器发送请求),你希望进程在指定时间后停止。

PHP 很难,因为它不能执行计划任务。您可以使用 sleep() 方法设置延迟,但在这种情况下,网页在整个过程完成之前不会得到任何响应(打开洒水器,X 秒后关闭洒水器)。 而且即使延迟太长(默认超过 30 秒),PHP 也会报错退出。 (最大运行时间可以用 set_time_limit() 方法设置,问题不大。)

个人推荐使用Java,因为它能够执行定时任务,或者使用大延迟,但我认为Java语言比PHP难学得多。

【讨论】:

  • 幸运的是,我已经了解 Java,所以这应该不是问题。我将研究在服务器上运行一个 java 文件,如果遇到任何问题,我会报告。谢谢你的建议。
  • 我可能需要一些帮助才能让 Java 在服务器上运行。我真的找不到关于服务器端 java 的任何信息。你有什么信息可以为我指明正确的方向吗?
  • link 也许这会有所帮助。 Spring Boot 帮了大忙!
【解决方案3】:

请先搜索再提问

PHP server side timer

<?php
$timer = 60*5; // seconds
$timestamp_file = 'end_timestamp.txt';
if(!file_exists($timestamp_file))
{
  file_put_contents($timestamp_file, time()+$timer);
}
$end_timestamp = file_get_contents($timestamp_file);
$current_timestamp = time();
$difference = $end_timestamp - $current_timestamp;

if($difference <= 0)
{
  echo 'time is up, BOOOOOOM';
  // execute your function here
  // reset timer by writing new timestamp into file
  file_put_contents($timestamp_file, time()+$timer);
}
else
{
  echo $difference.'s left...';
}
?>

【讨论】:

  • 仍然需要用户交互来运行代码。 (我的意思是当倒计时到零时,这不会自动关闭洒水器,只有当用户重新加载页面时)
  • 我在发布之前进行了搜索,正如我在问题中明确指出的那样。我还找到了您链接的问题,但它与我在问题中找到并提供的示例完全相同,这不足以满足我的需要。
猜你喜欢
  • 1970-01-01
  • 2023-02-15
  • 1970-01-01
  • 2023-03-13
  • 2016-04-09
  • 2020-04-08
  • 2011-03-12
  • 2017-10-20
  • 1970-01-01
相关资源
最近更新 更多