我尝试使用以下代码创建PHP缓存:
//Make cache files
$cache = 'tweets-cache.txt';
$date = 'tweets-date.txt';
$currentTime = time(); // Current time
// Get cache time
$datefile = fopen($date, 'r');
$cacheDate = fgets($datefile);
fclose($datefile);
//check if cache has expired
if (floor(abs(($currentTime-$cacheDate) / 10800)) <= $_GET['expiry'] && $cacheDate) {
$cachefile = fopen($cache, 'r');
$data = fgets($cachefile);
fclose($cachefile);
} else {
//Make the REST call
$data = (array) $cb->$api($params);
// update cache file
$cachefile = fopen($cache, 'wb');
fwrite($cachefile, utf8_encode($data));
fclose($cachefile);
// update date file
$datefile = fopen($date, 'wb');
fwrite($datefile, utf8_encode(time()));
fclose($datefile);
}
//Output result in JSON, getting it ready for jQuery to process
echo json_encode($data);
现在他没有在tweets-cache.txt中写任何内容。 我认为这是因为他不能用utf8_encode写一个数组。
答案 0 :(得分:1)
是的,你对utf8_encode()
功能是正确的。尝试将序列化数据写入文件:
fwrite($cachefile, json_encode($data));
当您从文件中读回数据时,请执行反序列化:
$data = json_decode(fgets($cachefile));
此外,如果你使用像file_get / put_contents这样的函数,你可以使事情更简单,所以你的代码:
$cachefile = fopen($cache, 'r');
$data = fgets($cachefile);
fclose($cachefile);
将是:
$data = json_decode(file_get_contents($cache));
和
// update cache file
$cachefile = fopen($cache, 'wb');
fwrite($cachefile, utf8_encode($data));
fclose($cachefile);
// update date file
$datefile = fopen($date, 'wb');
fwrite($datefile, utf8_encode(time()));
fclose($datefile);
转换为:
// update cache file
file_put_contents($cache, json_encode($data));
// update date file
file_put_contents($date, time());
请注意在多线程/多进程环境中使用文件系统时可能遇到的同步问题。 两个或更多的php实例可以尝试在同一时间将数据写入同一个文件,并且您将获得损坏的文件。
您可以使用文件系统锁定或Memcached等特殊缓存软件,这对于此类情况更为可取。
PHP Reference: file_put_contents()