在 PHP 中,是否有可能仅缓存页面的特定部分或 PHP 脚本中特定代码段的输出?当我尝试缓存特定页面时,似乎会缓存整个页面,而这不是我想要的。我的页面中的某些内容应在每次页面加载时更新,而其他内容(如从数据库获取数据的下拉列表)只需要每小时更新一次。
在 PHP 中,是否有可能仅缓存页面的特定部分或 PHP 脚本中特定代码段的输出?当我尝试缓存特定页面时,似乎会缓存整个页面,而这不是我想要的。我的页面中的某些内容应在每次页面加载时更新,而其他内容(如从数据库获取数据的下拉列表)只需要每小时更新一次。
如果您谈论的是浏览器缓存(以及它可能与之交互的任何代理),那么不行。缓存仅在完整的HTTP资源上进行(即按URI每个基础进行)。
在您自己的应用程序中,您可以缓存数据,以便无需在每个请求上访问数据库。 Memcached 是一种流行的方法。
为此,我可能会使用Zend框架的Zend_Cache
库。
您可以仅使用此组件,而不需要使用整个框架。
请前往Zend Framework 下载页面并获取最新版本。
下载核心文件后,您需要在项目中包含Zend_Cache。 Zend_Cache文档。
您决定如何缓存数据了吗?您使用文件系统还是Memcache?一旦确定了您要使用哪个,您需要使用特定的Zend_Cache后端。
后端文档:Zend_Cache 后端 前端文档:Zend_Cache 前端
因此,您可以这样做...
<?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
,这是简单的。您将使用 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/
很抱歉这个问题写得比预期的时间长,而且已经有很多答案了!
这取决于你使用的缓存和视图技术。一般来说,是的,你可以做类似这样的事情:
// 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().').';
摘自Zend_Cache文档。
否则,在您的示例中,您可以始终创建一个返回下拉列表并在该函数内实现缓存机制的函数。这样,您的页面甚至不知道缓存的存在。
require 'Zend/Cache.php';
就可以了。不过这只是一种方法,你甚至可以通过纯 PHP 和 output_buffering 函数实现相同的功能。 - Fabio