首页 文章

什么是在PHP中缓存文件的最佳方法?

提问于
浏览 1505
4

我正在使用Smarty和我的PHP代码,我喜欢缓存一些网站页面,所以我使用以下代码:

// TOP of script
ob_start();   // start the output buffer
$cachefile ="cache/cachefile.html";
// normal PHP script 
$smarty->display('somefile.tpl.html') ;
$fp = fopen($cachefile, 'w'); // open the cache file for writing
fwrite($fp, ob_get_contents()); // save the contents of output buffer to the file
fclose($fp); // close the file
ob_end_flush(); // Send the output to the browser

但是当我在php文件的末尾打印ob_get_contents()时它是空的!实际上创建的缓存文件也是空的!所以当我使用smarty时,我怎么能在php中缓存文件我知道我可以使用smarty缓存但是由于某些原因它对我不起作用 .

另外请给我关于APC缓存的信息 . 如何使用它?是否值得在我的情况下使用,我瘦它只是为了缓存数据库查询,我阅读关于它的PHP手册但我不能得到任何东西:)坦克 .

2 回答

  • 1

    我已经从文档中找到了一些代码(位于here),以获得更完整的智能缓存示例 . 另外,我'm not sure what you were using in your example, but you should be using smarty'的方法来操纵缓存 .

    require('Smarty.class.php');
        $smarty = new Smarty;
    
        // 1 Means use the cache time defined in this file, 
        // 2 means use cache time defined in the cache itself
        $smarty->caching = 2; 
    
        // set the cache_lifetime for index.tpl to 5 minutes
        $smarty->cache_lifetime = 300;
    
        // Check if a cache exists for this file, if one doesn't exist assign variables etc
        if(!$smarty->is_cached('index.tpl')) {
            $contents = get_database_contents();
            $smarty->assign($contents);
        }
    
        // Display the output of index.tpl, will be from cache if one exists
        $smarty->display('index.tpl');
    
        // set the cache_lifetime for home.tpl to 1 hour
        $smarty->cache_lifetime = 3600;
    
        // Check if a cache exists for this file, if one doesn't exist assign variables etc
        if(!$smarty->is_cached('home.tpl')) {
            $contents = get_database_contents();
            $smarty->assign($contents);
        }
    
        // Display the output of index.tpl, will be from cache if one exists
        $smarty->display('home.tpl');
    

    至于APC缓存,它的工作方式与smarty相同 . 它们都将数据存储在文件中一段特定的时间 . 每次要访问数据时,它都会检查缓存是否有效,如果是,则返回缓存值 .

    但是,如果不使用smarty,您可以使用APC:
    这个例子通过将数据库查询的结果存储在缓存中,类似地,您可以修改它来代替存储整个页面输出,这样您就不必经常运行昂贵的PHP函数 .

    // A class to make APC management easier
    class CacheManager  
    {  
         public function get($key)  
         {  
              return apc_fetch($key);  
         }  
    
         public function store($key, $data, $ttl)  
         {  
              return apc_store($key, $data, $ttl);  
         }  
    
         public function delete($key)  
         {  
              return apc_delete($key);  
         }  
    }
    

    结合一些逻辑,

    function getNews()  
    {  
         $query_string = 'SELECT * FROM news ORDER BY date_created DESC limit 5';  
    
         // see if this is cached first...  
         if($data = CacheManager::get(md5($query_string)))  
         {  
                 // It was stored, return the value
              $result = $data;  
         }  
         else  
         {  
                 // It wasn't stored, so run the query
              $result = mysql_query($query_string, $link);  
              $resultsArray = array();  
    
              while($line = mysql_fetch_object($result))  
              {  
                   $resultsArray[] = $line;  
              }  
    
                 // Save the result inside the cache for 3600 seconds
              CacheManager::set(md5($query_string), $resultsArray, 3600);  
         }  
    
         // Continue on with more functions if necessary 
    }
    

    此示例稍微修改自here .

  • 1

    你的意思是你在调用ob_end_flush()后再次调用ob_get_contents()?如果是这样,您写入文件的内容将从PHP的内存中“删除” .

    如果您仍希望输出HTML,请先将ob_end_flush保存到变量中,然后将其传递给fwrite . 您可以在页面后面使用该变量 .

相关问题