在php中缓存文件的最佳方式是什么?

在php中缓存文件的最佳方式是什么?,php,caching,smarty,buffering,Php,Caching,Smarty,Buffering,我在php代码中使用Smarty,我喜欢缓存一些网站页面,因此我使用了以下代码: // 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 fi

我在php代码中使用Smarty,我喜欢缓存一些网站页面,因此我使用了以下代码:

// 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手册,但什么都找不到:)
坦克

我已经将文档(位于)中的一些代码混合在一起,以获得更完整的smarty缓存示例。另外,我不确定您在示例中使用了什么,但您应该使用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:
本例将DB查询的结果存储在缓存中,类似地,您可以修改它来存储整个页面输出,这样您就不必频繁运行昂贵的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 
}  

此示例略为修改自。

您的意思是在调用ob\u end\u flush()之后再次调用ob\u get\u contents()?如果是这样,您写入文件的内容将从PHP内存中“删除”


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

@lan Elliott是的,Smarty缓存是个好主意,但我不能使用它。因为我只有一个$smarty->display('index.tpl');其他页面如news.tpl进入我的index.tpl中心,如{include file=$page\u center}然后在news.php文件中,我使用这一行$smarty->assign('page\u center','news.tpl');但是当我启用缓存时,它仍然会显示页面中心的默认内容而不是news.tpl,但当我停止缓存时,它工作得很好。@mehdi这听起来像是需要使用自定义缓存ID-允许您缓存任意多个版本的
index.tpl
。e、 g.在
news.php
中调用
$smarty->display('index.tpl','news |'。$article_id)
对于帮助页面,您可以使用缓存id
'help |'$主题
等(使用管道字符构造缓存ID允许您有选择地清除缓存-例如,一次清除所有新闻文章。)