是否可以仅在PHP中缓存页面的特定部分,或者在PHP脚本中缓存特定代码段的输出?似乎当我尝试缓存特定页面时,它会缓存整个页面,这不是我想要的,我的页面中的一些内容应该在每个页面加载时更新而其他页面(例如包含来自数据库的数据的下拉列表) )只需要每小时更新一次。
答案 0 :(得分:5)
如果您正在谈论浏览器(以及它可能与之交互的任何代理)的缓存,那么不。缓存仅发生在完整的HTTP资源上(即基于每个URI)。
在您自己的应用程序中,您可以缓存数据,这样您就不需要(例如)在每个请求中访问数据库。 Memcached是一种流行的方法。
答案 1 :(得分:3)
我可能会使用Zend Frameworks Zend_Cache
库。
您可以使用此组件而无需使用整个框架。
跳到Zend Framework Download Page并抓住最新的。
下载核心文件后,您需要在项目中包含Zend_Cache。 Zend_Cache个文档。
您是否已决定如何缓存数据?你在使用文件系统吗?或者你是memcache?一旦知道了要使用的内容,就需要使用特定的Zend_Cache后端。
后端文档:Zend_Cache Backends 前端文档:Zend_Cache Frontends
所以你会做这样的事情......
<?php
// configure caching backend strategy
$backend = new Zend_Cache_Backend_Memcached(
array(
'servers' => array( array(
'host' => '127.0.0.1',
'port' => '11211'
) ),
'compression' => true
) );
// configure caching frontend strategy
$frontend = new Zend_Cache_Frontend_Output(
array(
'caching' => true,
'cache_id_prefix' => 'myApp',
'write_control' => true,
'automatic_serialization' => true,
'ignore_user_abort' => true
) );
// build a caching object
$cache = Zend_Cache::factory( $frontend, $backend );
这将创建一个使用Zend_Cache_Frontend_Output
缓存机制的缓存。
要使用您想要的Zend_Cache_Frontend_Output
,它将是simple。您可以使用output
代替核心。您传递的选项是相同的。然后使用它你会:
// if it is a cache miss, output buffering is triggered
if (!($cache->start('mypage'))) {
// output everything as usual
echo 'Hello world! ';
echo 'This is cached ('.time().') ';
$cache->end(); // output buffering ends
}
echo 'This is never cached ('.time().').';
实用博客:http://perevodik.net/en/posts/14/
对不起,这个问题的写作时间比预期的要长,而且我已经写了很多答案!
答案 2 :(得分:1)
您可以使用ob_start(),ob_end_flush()和类似函数来滚动自己的缓存。收集所需的输出,将其转储到某个文件或数据库中,如果条件相同则稍后读取。我通常会建立状态的md5总和,然后再恢复它。
答案 3 :(得分:1)
这取决于您使用的缓存和视图技术。一般来说是的,你可以这样做:
// if it is a cache miss, output buffering is triggered
if (!($cache->start('mypage'))) {
// output everything as usual
echo 'Hello world! ';
echo 'This is cached ('.time().') ';
$cache->end(); // output buffering ends
}
echo 'This is never cached ('.time().').';
否则在您的示例中,您始终可以创建一个函数,该函数返回下拉列表并在该函数内实现缓存机制。通过这种方式,您的页面甚至不知道缓存。