Laravel: как мне сравнить / получить конкретные данные из кэша?

#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];
}
 

}