Caché readdir ()

¿Hay alguna forma de almacenar en caché el resultado de readdir ()? Ahora mismo leo readdir () en un árbol de directorios cada vez que ingreso a una página web específica en el sitio web.

ACTUALIZAR:

  • La estructura del directorio es la misma para todos los usuarios.
  • Lamentablemente, mi host compartido no es compatible con APC o Memcache 🙁

Puedes usar Memcache con 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)); 

Actualizar

Lamentablemente, mi host compartido no es compatible con APC o Memcache 🙁

Puede usar File Systems

 $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)); 

Clase utilizada

 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); } } 

Puede almacenarlo en una variable de sesión si comienza una sesión. Mire la función session_start (), etc.

Puede almacenar en caché cualquier estructura PHP serializable usando una cantidad de métodos. PHP se envía con APC en estos días, por lo que sugiero mirar el almacenamiento en caché de objetos de APC.

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

Asegúrese de tener cierta lógica para borrar el caché cuando la estructura del directorio cambie.