我帮助一位朋友为他的一个剧本写一个有点合理的缓存功能。它主要使用9种不同的SQL查询来获取排行榜数据(其中一种非常繁琐)
我想出了为它创建缓存的想法,从这开始:
// Cache directory
$cacheDir = "/cache";
// Path to cache directory
$cachePath = "/var/www/html/test";
// Better safe than sorry
if (!file_exists($cachePath . $cacheDir))
{
mkdir($cachePath . $cacheDir, 0777, true);
}
// Cache rebuild switches
$monsterCache = false;
$pvpCache = false;
$guildCache = false;
// Get the size and all files within the cache directory
$cache = array_slice(scandir($cachePath . $cacheDir), 2);
$cacheSize = sizeof($cache);
继续,我设置了一些开关以确定是否需要更新,然后获取包含缓存文件夹中所有文件的数组的所有文件和大小。
我跟进了这个:
// Validate the cached files
if ($cacheSize < 1) {
// None present. Rebuild all.
$monsterCache = true;
$pvpCache = true;
$guildCache = true;
} else {
for ($i = 0; $i < $cacheSize; $i++) {
// Check the monster kill cache
if (preg_match('/^[0-9]+_monster_kills_leaderboard\.php/', $cache[$i], $cacheFile)) {
if (time() >= explode('_', $cacheFile[0])[0]) {
unlink($cachePath . $cacheDir . "/{$cache[$i]}");
$monsterCache = true;
}
} else {
$monsterCache = true;
}
// Check the PVP cache
if (preg_match('/^[0-9]+_pvp_leaderboard\.php/', $cache[$i], $cacheFile)) {
if (time() >= explode('_', $cacheFile[0])[0]) {
unlink($cachePath . $cacheDir . "/{$cache[$i]}");
$pvpCache = true;
}
} else {
$pvpCache = true;
}
// Check the Castle Guild leader cache
if (preg_match('/^[0-9]+_guild_leader\.php/', $cache[$i], $cacheFile)) {
if (time() >= explode('_', $cacheFile[0])[0]) {
unlink($cachePath . $cacheDir . "/{$cache[$i]}");
$guildCache = true;
}
} else {
$guildCache = true;
}
}
}
我所做的是在创建和写入缓存文件时,我附加一个unix时间戳来表示它的有效时间,将其从文件名中拆分并将当前时间与时间戳的时间进行比较以确定是否删除该文件并重新创建它。 ( timestamp_pvp_leaderboard.php )
我正在写这样的文件:
if ($monsterCache) {
$monsterCache = false;
// This decides how long the cache is valid
// Updates every hour from initialization.
$cacheTTL = strtotime('+1 Hour', time());
// Fetch the monster data
<snip>
// Construct data
$data = array(
'Name, Kills' => $result[0]->__get("name") . ', ' . $result[0]->__get("kills"),
'Name, Kills' => $result[1]->__get("name") . ', ' . $result[1]->__get("kills"),
'Name, Kills' => $result[2]->__get("name") . ', ' . $result[2]->__get("kills")
);
// Populate the cache
foreach($data as $key => $val) {
file_put_contents($cachePath . $cacheDir . "/{$cacheTTL}_monster_kills_leaderboard.php", $key.', '.$val.PHP_EOL, FILE_APPEND | LOCK_EX);
}
}
这在我的计算机上运行良好,使用多个浏览器坐在页面上并发送垃圾邮件,但是第二个触摸缓存文件(比如第一次读取它,或者在脚本运行时打开它)文件本身就会被添加垃圾邮件。它重复了3个相同的领域。
到目前为止,我尝试了一些不同的方法,但我绝对无法弄清楚发生了什么。
以前有没有其他人遇到过这个?你是怎么解决的? 我在这里做错了什么或错过了什么?
我今天晚些时候会继续关注它,但要提前感谢任何见解!不幸的是,自从我轻松使用PHP以来已经有一段时间了。
答案 0 :(得分:0)
我认为您可以尝试使用任何现有的缓存系统,例如APC。它允许您设置(使用所需的TTL)并获取大部分数据。它非常可靠且易于使用。