#php #caching #laravel #laravel-4 #polling
#php #кэширование #ларавель #laravel-4 #опрос
Вопрос:
В моем обычном приложении для опроса Laravel chat я сохраняю новые сообщения, отправленные пользователем, в файловый кэш с ключом в виде строки, получая его значение из date(current_time)
функции и тела сообщения.
Затем, когда я захочу получить эти сообщения, я буду использовать последнее значение опроса $lastPolled = Session::get('lastPolled')
и сравнивать с ключом в кэше. Ключи, размер которых превышает значение $lastPolled, будут иметь свои данные, которые будут приниматься как новые сообщения и добавляться в диалоги.
Наконец, я обновлю значение последнего опрошенного сеанса Session::put('lastPolled',date(Y-m-d H:i:s)
Итак, как мне сравнить $lastPolled со всеми ключами в кэше и получить значения каждого ключа? Что — то вроде:
$latestMessages = array();
foreach(KeysInCache as Key=>value){
if($lastPolled>Key)
array_push($latestMessages,Key=>value);
}
Спасибо!
P.s. бонусные баллы за лучшие предложения. О, и я не могу использовать memcache / redis / otherSuperCaches по техническим причинам, только кэш файлов / базы данных. 🙁
Ответ №1:
Почему бы не попробовать что-то подобное, создав файлы кэша на основе метки времени или ключа :
Более подробная информация и предложения по этому же адресу: http://evertpot.com/107 /
// Это функция, в которой вы храните информацию с помощью function store ($key, $data, $ttl) {
// Opening the file $h = fopen($this->getFileName($key),'w'); if (!$h) throw new Exception('Could not write to cache'); // Serializing along with the TTL $data = serialize(array(time() $ttl,$data)); if (fwrite($h,$data)===false) { throw new Exception('Could not write to cache'); } fclose($h);
}
// Общая функция для поиска имени файла для определенного ключа частная функция GetFileName($key) {
return '/tmp/s_cache' . md5($key);
}
// Функция для извлечения данных возвращает false при сбое функции fetch($key) {
$filename = $this->getFileName($key); if (!file_exists($filename) || !is_readable($filename)) return false; $data = file_get_contents($filename); $data = @unserialize($data); if (!$data) { // Unlinking the file when unserializing failed unlink($filename); return false; } // checking if the data was expired if (time() > $data[0]) { // Unlinking unlink($filename); return false; } return $data[1]; }
}