Кэширование readdir ()

Есть ли в кэше результат readdir ()? Прямо сейчас я читаю readdir () в дереве каталогов каждый раз, когда я ввожу определенную веб-страницу на веб-сайт.

ОБНОВИТЬ:

  • Структура каталогов одинакова для всех пользователей.
  • К сожалению, мой общий хост не поддерживает APC или memcache 🙁

Solutions Collecting From Web of "Кэширование readdir ()"

Вы можете использовать Memcache с filemtime

 $path = __DIR__ . "/test"; $cache = new Memcache(); $cache->addserver("localhost"); $key = sha1($path); $info = $cache->get(sha1($path)); if ($info && $info->time == filemtime($path)) { echo "Cache Copy ", date("Ymd g:i:s", $info->time); } else { $info = new stdClass(); $info->readDir = array_map("strval", iterator_to_array(new FilesystemIterator($path, FilesystemIterator::SKIP_DOTS))); $info->time = filemtime($path); $cache->set($key, $info, MEMCACHE_COMPRESSED, 0); echo "Path Changed ", date("Ymd g:i:s", $info->time); } var_dump(array_values($info->readDir)); 

Обновить

К сожалению, мой общий хост не поддерживает APC или memcache 🙁

Вы можете использовать файловые системы

 $path = __DIR__ . "/test"; $cache = new MyCache(__DIR__ . "/a"); $key = sha1($path); $info = $cache->get($key); if ($info && $info->time == filemtime($path)) { echo "Cache Copy ", date("Ymd g:i:s", $info->time); } else { $info = new stdClass(); $info->readDir = array_map("strval", iterator_to_array(new FilesystemIterator($path, FilesystemIterator::SKIP_DOTS))); $info->time = filemtime($path); $cache->set($key, $info, MEMCACHE_COMPRESSED, 0); echo "Path Changed ", date("Ymd g:i:s", $info->time); } var_dump(array_values((array) $info->readDir)); 

Используемый класс

 class MyCache { private $path; function __construct($path) { is_writable($path) or trigger_error("Path Not Writeable"); is_dir($path) or trigger_error("Path Not a Directory"); $this->path = $path; } function get($key) { $file = $this->path . DIRECTORY_SEPARATOR . $key . ".cache"; if (! is_file($file)) return false; $data = file_get_contents($file); substr($data, 0, 2) == "##" and $data = gzinflate(substr($data, 2)); return json_decode($data); } function set($key, $value, $compression = 0) { $data = json_encode($value); $compression and $data = gzdeflate($data, 9) and $data = "##" . $data; return file_put_contents($this->path . DIRECTORY_SEPARATOR . $key . ".cache", $data); } } 

Вы можете сохранить его в переменной сеанса, если вы начнете сеанс. Посмотрите на функцию session_start () и т. Д.

Вы можете кэшировать любую сериализуемую структуру PHP, используя ряд методов. В наши дни PHP поставляется с APC, поэтому я предлагаю посмотреть на кеширование объектов APC.

http://uk1.php.net/manual/en/ref.apc.php

Обязательно иметь некоторую логику для очистки кеша при изменении структуры каталогов.