2009-07-08 90 views
4

我使用Smarty的与我的PHP代码,我想缓存一些网站的页面,所以我用下面的代码:在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(),它是空的!实际上创建的缓存文件也是空的!所以我怎么能在PHP中缓存文件时,我使用smarty我知道我可以使用smarty缓存,但它由于某种原因不适合我。

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

回答

1

我从Smarty的缓存更完整的示例文件(位于here)捣碎了一些代码。另外,我不确定你在你的例子中使用了什么,但是你应该使用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修改。

+0

@lan艾略特是的,Smarty缓存是个好主意,但我不能使用它。因为我只有一个$ smarty-> display('index.tpl');和其他像news.tpl其他页面进入我的index.tpl中心像这样{include file = $ page_center}然后在news.php文件中我使用这行$ smarty-> assign('page_center','news.tpl “);但是当我启用缓存它仍然显示页面中心的默认内容不news.tpl,但是当我的缓存它工作正常。 – mehdi 2009-07-11 14:00:17

1

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

如果您想还是输出HTML,ob_end_flush保存到一个变量,然后再传递到使用fwrite。您可以稍后使用该变量。

相关问题