【问题标题】:Not redrawing the page when the user presses the Back Button (Using $_GET variables in PHP)用户按下后退按钮时不重绘页面(在 PHP 中使用 $_GET 变量)
【发布时间】:2012-05-06 06:49:53
【问题描述】:

我有一个使用 PHP 绘制页面的动态网站。

使用 $_GET 变量,我从用户那里获取命令,基于 $_GET 命令执行 PHP,并绘制页面。

但是,当用户按下后退按钮时,我希望他们看到之前为他们动态绘制的页面,而不是重新执行代码。

我看过这个,但不知道怎么做。

例如假设以下代码:

if ($_GET['cmd'] == "time") {
   echo "The current Unix timestamp is: " . time;
}

单击 url: somepage.php?cmd=time 可以正确执行代码,但使用后退按钮时会重新执行代码。有没有办法使用缓存或其他我不知道的方法,让用户可以看到页面绘制时的时间,而不是重新执行?

================================================ =========================================== 为了尝试更具体一点,我正在谈论的页面和代码执行多个功能并根据给定的命令更改 MySQL 数据,然后绘制页面。

我想知道在使用后退按钮时是否有办法不重新执行而只显示第一次动态绘制的页面。

【问题讨论】:

    标签: php caching button dynamic back


    【解决方案1】:

    我不确定这是否是您正在寻找的,但它可能会有所帮助。而不是使用 php get,你可以使用 ajax 然后实现这个:http://www.nerdswithlives.com/2010/03/yui-ajax-browser-history-back-button.html

    您还可以在每次执行特定的 get 命令时存储某种类型的变量,然后检查该变量以确定在页面加载时要重绘哪些内容。

    编辑

    从更多地考虑您的问题,我相信答案在于使用 PHP 会话,并将数据存储在客户端机器上。当用户单击“返回”时,他/她将进入缓存页面......所以缓存不是您的答案。您需要以特定方式重新绘制它,但是因为您使用的是 GET,所以浏览器不会缓存它……至少有后退按钮功能。您的答案是在此动态内容存在的每个页面上启动一个会话,存储一个变量,如 $_SESSION['sessionVar'] = 1; 或其他。然后根据在该页面上绘制的内容动态更改变量。然后,当用户单击“返回”时,您可以检查该变量是什么并再次获取数据。摆脱为此使用缓存的心态 - 您需要重新绘制用户之前看到的任何数据。在这种情况下,会话会很有用。

    【讨论】:

    • 这不是我想要的,但感谢您的快速回复。
    • 没问题。也许显示更多您的代码(正在绘制的动态内容的示例......)可以帮助我们了解您尝试做什么。
    【解决方案2】:

    您应该使用 HTTP 缓存标头。共有三种策略:

    • 过期时间
    • ETags
    • 上次修改时间

    第一个设置页面过期的日期/时间。这可以通过发送header来实现:

    header('Expires: Thu, 28 Apr 2012 16:00:00 GMT');
    

    这种方法的主要问题是你不能使这个缓存失效。这意味着如果您想要重绘所有内容以更新页面上的内容,则必须等待缓存过期。

    ETag 具有更好的控制力,但更难实现:

    $etag = md5($pageId);
    if (isset($_SERVER['HTTP_IF_NONE_MATCH']) 
        && false !== stripos($_SERVER['HTTP_IF_NONE_MATCH'], $etag)) {
        header('HTTP/1.1 304 Not Modified');
        die;
    } else {
        header('ETag: '.$etag);
        //draw the page
    }
    

    当浏览器第一次点击页面时,页面被绘制并提供ETag 标头。下次浏览器点击该页面时,它会发送一个 HTTP 请求头 If-None-Match 与之前的 ETag 值。服务器必须将此标头与当前的 ETag 进行比较,如果它们相同,则服务器只需要发送一个空正文和一个304 Not Modified 状态。 ETag 可以是任何以唯一方式标识页面内容和版本的内容。

    Last Modification 的工作方式类似于 ETag,但它使用日期而不是服务器生成的标签。日期比较也必须考虑以后和以前的日期。

    Section 13 of the HTTP specification 涵盖了所有这些机制及其陷阱。读起来很难,但值得。

    【讨论】:

    • 这看起来更像我需要的。我会试试这个,当然会研究 ETag。谢谢你的时间!
    • 这似乎无法解决后退按钮问题。
    • 尝试与启用了 Firebug 的页面进行交互,并在“网络”选项卡上遵循请求。您应该看到请求是如何被缓存的。此外,还有一些标头会影响缓存机制,例如 Cookie。
    【解决方案3】:

    你可以看看使用$_SESSION

    if ($_GET['cmd'] == "time") {
       $_SESSION['time'] = isset($_SESSION['time']) ? $_SESSION['time'] : time;
       echo "The current Unix timestamp is: " . $_SESSION['time'];
    }
    

    【讨论】:

    • 该代码只是我的意思的一个示例,但是几个不同文件的实际代码执行了几个操作,包括与 MySQL 数据库交互以绘制输出。如果可能的话,我只想以当时绘制的状态显示页面。
    • 那可以看看APC,或者memcache
    猜你喜欢
    • 2014-02-17
    • 2020-02-20
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2011-06-05
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多