2012-02-22 18 views
5

Tengo una página que tiene bastantes datos cargados desde mi db. Me gustaría acelerar el tiempo de carga. Ya hago una búsqueda en caché, pero el tiempo de carga es más largo de lo que me gustaría.¿Caché o tienda en sesión?

¿Es posible representar una tabla con datos y almacenarla en una sesión para cargar en cada actualización de página nueva? Incluso estaba pensando en ponerlo en un archivo de texto externo usando ob_start();

¿Cuál es la mejor manera de manejarlo?

+0

¿Qué ha hecho para identificar dónde está el cuello de botella? Cualquier perfil? –

+1

¿Por qué no empezaste tratando de hacer ** tus consultas más rápido ** para no molestarte con el almacenamiento en caché? – zerkms

+0

@ Louis-Philippe Huberdeau ¿Qué herramienta recomendaría para crear perfiles? – santa

Respuesta

2

Almacenarlo en sesiones probablemente no es la mejor idea, cuando agrega datos a una sesión (de manera predeterminada) los datos se escriben en un archivo en el sistema operativo, generalmente en/tmp/lo que significa que va a estar golpeando el disco bastante y almacenando la misma cantidad de datos.

Si los datos no es usuario específico entonces se podría almacenar en el disco o en la memoria - (ver: php.net/apc)

Si los datos son usuario específico, recomiendo almacenarla en un sistema distribuido caché, tales como Memcached (memcached.org) PHP tiene una biblioteca puede activar (php.net/memcached)

(por el usuario específico me refiero a los datos como a las transacciones de los usuarios, artículos, carrito de compras, etc.)

La lógica es básicamente la misma para cualquier método que elija:

Memcached, el usuario ejemplo datos específicos:

<?php 

$memcached = new Memcached(); 
$data = $memcached->get('shopping-cart_' . $user_id); 

if (!$data) { 
    $sql = $db->query(".."); 
    $data = array(); 
    while($row = $query->fetch_assoc()) { 
     $data[] = $row; 
    } 
    $memcached->set('shopping-cart_' . $user_id, $data); 
} 
?> 
<table> 
<?php 
foreach ($data as $item) { 
    echo '<tr><td>' . $item['name'] .' </td></tr>'; 
} 
?> 
</table> 

datos globales (no usuario específico)

<?php 
$cache_file = '/cached/pricing-structure.something'; 

if (file_exists($cache_file)) { 
    echo $cache_file; 
} else { 
    // heavy query here 
    $h = fopen('/cached/pricing-structure.something', 'w+'); 
    fwrite($h, $data_from_query); 
    fclose($h); 
} 
0

Si usted está haciendo el almacenamiento en caché en un único servidor web (en contraposición a múltiples servidores distribuidos), PHP APC es una solución muy fácil de usar. Es un caché en memoria, similar a Memcache, pero se ejecuta localmente. Evitaría almacenar cualquier cantidad significativa de datos en sesión.

APC es una extensión PECL y se puede instalar con el comando

pecl install apc 

Es posible que tenga que activarlo en su php.ini.

Cuestiones relacionadas