【问题标题】:Add delay before PHP echo在 PHP 回显之前添加延迟
【发布时间】:2014-03-07 12:55:24
【问题描述】:

我在一个简单的 PHP 脚本中有一个 echo 调用来在屏幕上打印一个参数:

<body>
<p>the string will appear in 30 seconds:</p>
<p><?php echo $string; ?></p>
</body>

我希望在“回声”运行之前,该系统将等待 X 秒。因此,文本“字符串将在 30 秒后出现”将首先出现,30 秒后,$string 将出现在其下方。怎么做? Sleep() 倾向于在加载之前延迟整个页面。

【问题讨论】:

  • 确保你的输出没有被缓冲。
  • 看起来使用 javascript 会更好地实现?
  • 那么你应该使用Javascript来执行异步任务。

标签: php


【解决方案1】:

您可以使用 PHP sleep 等待 30 秒:

<body>
<p>the string will appear in 30 seconds:</p>
<p><?php sleep(30); echo $string; ?></p>
</body>

但是,当您执行此操作时,根据您的 PHP 和 Apache 设置,您的整个页面可能会等待 30 秒,然后才能完全呈现并将 HTTP 响应发送回客户端。

此外,如果您向客户端发送部分响应,它有时可能会等待呈现内容,直到加载足够的页面来呈现数据(例如,在表格的情况下)。

尝试改用 JS,让页面渲染,然后在 30 秒后呈现隐藏数据:

<body>
<p>the string will appear in 30 seconds:</p>
<p id="sleep" style="display:none"><?php echo $string; ?></p>
<script>
    window.setTimeout(function() {
        document.getElementById('sleep').style.display = '';
    }, 30000);
</script>
</body>

【讨论】:

  • 确实,sleep() 会延迟整个页面。第二种方法不知何故不起作用,但是当使用 JS 做类似的事情时,代码确实在 X 秒后出现,但它仍然在我试图阻止这种情况的 html 源代码中可见。
  • 您可以改为使用延迟 30 秒的 AJAX 请求从服务器检索数据并将其显示在页面上。查看api.jquery.com/load
  • 它不起作用,因为我有 30 毫秒的超时。更新到 30000,按预期工作。
【解决方案2】:

您可以尝试使用 Javascript 解决这种情况。 jQuery 库非常干净和有用。你应该试试:

HTML

<body>
    <p>the string will appear in 30 seconds:</p>
    <p id="string" hidden="hidden"><?php echo $string; ?></p>
</body>

JS

$( document ).ready(function() {
    $("#string").delay(30000).show();
});

重要提示:由于 Javascript 是一种客户端语言,因此该解决方案只是“延迟”在客户端设备中回显 $string,但在任何情况下都会收到变量 $string从服务器...如果有一些“不耐烦且容易被黑客攻击”的客户端,只需查看页面的源代码就可以了... :(

服务器端替代方案:如果提供的解决方法对您的应用程序无效(因为我不知道它的安全要求),我会尝试,例如使用替代的服务器端方法检查.以下是基本步骤:

  1. 初始请求时间戳与客户端信息一起保存在服务器上(例如,在会话 cookie 中)。

    李>
  2. 那么,不要直接从服务器发送 $string,留空即可。

  3. 对于 JS,延迟 30 秒,然后再次向服务器(例如通过 AJAX)请求 $string。此 AJAX 调用将在初始请求后 30 秒触发,服务器现在可以检查会话 cookie(包含有关客户端和时间戳的信息)。

  4. 如果 (current_timestamp() - cookie_timestamp() >= 30) ==> 服务器返回 $string,否则不返回任何内容。

祝你好运;)

【讨论】:

  • TNX...我决定做一个服务器端解决方案。所有 JS 方法 隐藏字符串但它出现在 html 源中。
【解决方案3】:

这对我有用 如果您想为我在 content 上添加更多时间更改,我在进入 read.php 页面之前添加了 2

  echo "<meta http-equiv='refresh' content='2;URL=read.php'/>";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-07
    • 2011-11-28
    • 2019-07-10
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    相关资源
    最近更新 更多