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

В моем обычном приложении чата Laravel с опросом я буду сохранять новые сообщения, отправленные пользователем, в файловый кеш с ключом в виде строки, получая его значение из функции 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 по техническим причинам, только кеш файла/базы данных. :(


person Ricardo    schedule 25.06.2014    source источник


Ответы (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);

}

// Общая функция для поиска имени файла для определенного ключа private function getFileName($key) {

  return '/tmp/s_cache' . md5($key);

}

// Функция извлечения данных возвращает false при ошибке function 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];
}

}

person Chhavi Gangwal    schedule 25.06.2014