0

我使用 gcache 将整个网站页面缓存为 HTML,然后我只阅读它并向用户显示。它看起来像这样:

$enableCache = true; 
if ($enableCache)
{
    include("gcache.php");
    $cache = new gCache;
    $cache->folder = "temp/";
    $id = join("", $_GET);
    $id = ereg_replace("[^A-Za-z0-9]", "", $id);
    $cache->contentId=$id;
    $cache->timeout = 5; 
    /* its mean gCache cached the whole page */
    /* so, gcache, decide if he must response the compressed or */
    /* uncompressed cache*/
    $cache->isPage = true; 
    if ($cache->Valid()) {
        echo $cache->content;
        die;
    }
    $cache->capture();
}

并且工作正常。现在我在网站的标题中添加了一个链接“登录”。当人们点击它时,它会将人重定向到他/她提供信用的子页面,设置会话参数(在调用 session_start 之前):

  $_SESSION['theUser'] = $userId;
  header( "refresh:1;url=http://mysite.com"); 

并且人员被重定向到 mysite.com。但问题是他/她看到该站点是从缓存中获取的。所以在右上角再次出现“登录”,但我设置了当设置 $_SESSION['theUser'] 时它应该显示它并提供一个注销链接。但它不显示,因为它返回给用户未登录的网站版本。

如何解决这个问题?

4

1 回答 1

0

我假设,以这种方式使用缓存的原因是为了最小化服务器负载和响应时间。但这可以通过不使用第三方插件/类/东西的更简单的方法来实现:

<?php
    global $cachefile;
    //encode cache file name with sha1 
    $cachefilename = sha1($_SERVER['REQUEST_URI']);
    //remove trailing slash
    $cachefile = rtrim(sys_get_temp_dir (),'\\/').DIRECTORY_SEPARATOR.$cachefilename.'.cache';
     // How long to keep cache file?
    $cachetime = 60*5;    //5min
    // Is cache file still fresh? If so, serve it.   
    if (file_exists($cachefile) && filesize($cachefile)>100 && time() - $cachetime < filemtime($cachefile)  )  {
      readfile($cachefile);
      exit;
    }

    function cacheOutputtoFile()   {
     global $cachefile;
     $webpage = ob_get_contents();
     if ($fp = fopen($cachefile, 'w+'))
        {
            // Do an exclusive lock
            if (flock($fp, LOCK_EX))
            { 
               // Truncate file 
               ftruncate($fp, 0); 
               fwrite($fp, $webpage);
               fclose($fp);
            }
        }
    }

    ob_start();
    register_shutdown_function("cacheOutputtoFile");

注意:当调用回调函数时,您必须使用register_shutdown_function()而不是使用cacheOutputtoFile() as 参数,ob_start()因为套接字已经关闭,然后客户端不会得到回显$webpage输出。

用法:将此文件放在您的根服务器文件夹(或任何您想要的位置)中,并要求它位于您要缓存的每个页面的顶部。

require_once("cacheable.php");
于 2012-05-17T14:05:18.343 回答