<?php
// cache - will work online - not locally
// location and prefix for cache files
define('CACHE_PATH', "siteCache/");
// how long to keep the cache files (hours)
define('CACHE_TIME', 12);
// return location and name for cache file
function cache_file()
{
return CACHE_PATH . md5($_SERVER['REQUEST_URI']);
}
// display cached file if present and not expired
function cache_display()
{
$file = cache_file();
// check that cache file exists and is not too old
if(!file_exists($file)) return;
if(filemtime($file) < time() - CACHE_TIME * 3600) return;
// if so, display cache file and stop processing
readfile($file);
exit;
}
// write to cache file
function cache_page($content)
{
if(false !== ($f = @fopen(cache_file(), 'w'))) {
fwrite($f, $content);
fclose($f);
}
return $content;
}
// execution stops here if valid cache file found
cache_display();
// enable output buffering and create cache file
ob_start('cache_page');
?>
这是我在db文件中的动态网站中使用的缓存代码。每个页面都包含此代码。
<?php session_start();
include("db.php"); ?>
正在缓存页面并且它正在工作但是在表单提交,用户登录,通过页面的变量上,没有任何事情发生。正在显示旧页面。如何使用此缓存代码以使其可以正常工作,但网站也可以正常运行。
我想知道wordpress插件是如何做到的。 Wp超级缓存和W3T缓存可以缓存所有内容,但博客仍可正常运行。我应该有选择地在网站的某些部分使用它。
像这样:
<?php
// TOP of your script
$cachefile = 'cache/'.basename($_SERVER['SCRIPT_URI']);
$cachetime = 120 * 60; // 2 hours
// Serve from the cache if it is younger than $cachetime
if (file_exists($cachefile) && (time() - $cachetime < filemtime($cachefile))) {
include($cachefile);
echo "<!-- Cached ".date('jS F Y H:i', filemtime($cachefile))." -->";
exit;
}
ob_start(); // start the output buffer
// Your normal PHP script and HTML content here
// BOTTOM of your script
$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
?>
但它不会有效,因为它关于pageURL(整页缓存),而不是来自页面的选择性内容。
请指教。有没有简单的脚本可以做到这一点。 Pear :: Cache_Lite看起来不错,但看起来很难实现。
更新:我使用过Cache_Lite。一样的。缓存一切或包含php文件。可供使用的配置选项很少。但如果作为一个整体使用,它也会忽略get,post,session数据更新...并显示以前的缓存页面,除非它们被删除。
答案 0 :(得分:0)
我认为你可以将显示与逻辑分开。
我的意思是,更改表单的action属性并将其指向没有缓存逻辑的php(您必须检查引用或其他参数,使用令牌或会话等,以避免CSRF等安全问题)。
我想指出的其他事情是你应该只查看最常访问的页面(即主页),通常你没有缓存的“一刀切”,最好不要担心没有速度/负载问题的页面。或者,如果速度问题来自数据库查询,则可能更好地缓存数据(您应该在实现缓存之前对应用程序进行概要分析)。
迁移工作的其他方法是检查请求方法并在使用$_SERVER['REQUEST_METHOD'] == 'POST'
发布(假设所有表单都使用POST方法)时禁用缓存。