2014-02-05 3 views
0

я пытаюсь сделать мой PHP кэш с этим кодом: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); 

Теперь он ничего не пишет в чириканье-cache.txt. Я думаю, это из-за того, что он не может написать массив с utf8_encode.

ответ

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()

Смежные вопросы