PHP缓存不向文本文件写入任何内容

时间:2014-02-05 11:23:44

标签: php arrays json utf-8

我尝试使用以下代码创建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写一个数组。

1 个答案:

答案 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等特殊缓存软件,这对于此类情况更为可取。

Memcached

PHP Reference: file_put_contents()

PHP Reference: file_get_contents()

PHP Reference: json_encode()