2010-02-05 10 views
6

Tengo un muy complicado index.php ahora, y me gustaría ejecutarlo solo una vez cada hora. ¿Cuál es la mejor manera de lograr esto? Algunas ideas que he tenido¿Cuál es la mejor manera de hacer caché de salida del lado del servidor en PHP?

  • lo puso en APC con apc_store($page, 60*60*) - Siento que esto no es lo que es para APC y es probable que estar haciendo algo mal a las otras partes de mi sitio
  • guardar la salida en un sistema de archivos en alguna parte - Entonces apache necesita acceso de escritura en alguna parte, lo que podría ser un dolor
  • De alguna manera configuró Apache para hacer el almacenamiento en caché para mí - ¿Es esto posible?
+1

He visto APC utilizado exactamente para eso, no creo que sea malo. – Piskvor

Respuesta

1

Fui con una ligera variación en Rowlf de y la respuesta de jamietelin.

crear 3 archivos:

índice.html

<meta http-equiv="refresh" content="0;url=/index_update.php" /> 

index.php

<?php // do all your normal stuff ?> 

index_update.php

<?php 

$file = "index.html"; 
$time = 60 * 10 - (time() - filemtime($file)); 

# this is on the first install 
if (filemtime($file) != filectime($file)) 
    $time = 0; 

if ($time > 0) { 
    die("Data was already updated in the 10 minutes. Please wait another " . ($time) . " seconds."); 
} 

ob_start(); 
require "index.php"; 
$data = ob_get_contents(); 

$fp = fopen($file, "w"); 
fwrite($fp, $data); 
fclose($fp); 

header("Location: /"); 

Y entonces una tarea programada:

*/15 * * * * curl http://example.com/index_update.php 

Por lo tanto, si alguien tropieza en la página después de un impulso de producción, creará transparentemente un nuevo index.html para usted, de lo contrario, su cronjob lo hará cada 15 minutos.

Solo asegúrese de que index.html se puede escribir en su servidor apache. Si eso suena aterrador, simplemente haga que su cronjob se ejecute php index_update.php como otro usuario con privilegios de escritura en index.html. Sin embargo, no tendrás acceso a todo el entorno apache.

Espero que esto ayude, los comentarios son bienvenidos.

0

realmente debería echar un vistazo a Memcached (excelente php apoyo.)

Otra buena opción es configurar un Squid Cache Server.

+0

ambos necesitan una dependencia adicional. Para este caso de uso, no sé si eso está garantizado ... –

1

La entrega de páginas estáticas es siempre la más optimizada. Así que use, por ejemplo, Cron, o cualquier otro servicio de programación de su elección, para generar una versión estática de su índice una vez por hora y haga que lo escriba en un archivo, por ejemplo index.html. Incluso podría hacer que lo genere como .php si aún necesita algunas partes dinámicas en el índice.

Yo diría que esta es la mejor manera absoluta. Por supuesto, es un poco doloroso manejar la configuración de chmod para el archivo, pero no es un gran problema.

0

Guardar la página en un archivo estático y utilizar .htaccess reglas para servir la página estática.

No estoy seguro sobre los detalles exactos, pero creo codeignitor y Drupal impulso para hacer esto.

3
  1. Cuando un visitante llega a su página, genera el contenido, envíelo al usuario y guarde un archivo estático en algún lugar del disco.
  2. Cuando llegue el siguiente visitante, primero hay que buscar el archivo guardado, y si existe, sirven que en lugar de ejecutar todo el código en el archivo index.php. Un ejemplo básico sería

    if (file_exists($cacheFileName)) 
    { 
        require $cacheFileName; 
        exit; 
    } 
    
    // here goes the rest of your index.php code 
    //.. 
    
    // assuming your output is buffered and is contained in $output: 
    echo $output; 
    
    $cacheFileName = '/path/to/your/file.inc'; 
    file_put_contents($cacheFileName, $output); 
    
  3. configurar una tarea cron que suprimirá su archivo de caché de disco salvado de cada hora o tan a menudo como sea necesario para . Alternativamente, en su index.php, en cada página de hit, compruebe cuánto tiempo hace que se creó el archivo en caché y genere un nuevo archivo de caché si ha estado más tiempo del que le gustaría. Sin embargo, un trabajo cron es más fácil de configurar.

Para responder a la pregunta filosófica profunda, sin embargo, el ahorro de salida generada en el disco en archivos separados es probablemente la mejor manera si no quiere depender de terceros soluciones de almacenamiento en caché del partido. APC es bueno para almacenar en caché el código que regenerará las páginas cuando sea necesario, y memcached es definitivamente excesivo si estamos hablando de una aplicación pequeña (ish).

+0

Gracias. ¿Por qué el almacenamiento en disco es mejor que APC? –

+0

No diría que una es mejor que la otra, las usaría para diferentes propósitos. APC es bueno cuando tienes una aplicación compleja y necesitas: 1) acelerar PHP; 2) guarda en caché algunos valores de usuario que son caros de generar. Como, no sé, una lista de todos los archivos disponibles en el sistema para la función __autoload() o cualquier otra variable que requiera recursos significativos para construir y no sea específica del usuario, por lo que puede almacenarla en caché de forma segura. No arrojaría la salida de página generada en APC, no es para lo que es. – Rowlf

+0

Gracias. ¿Cuál es el inconveniente exacto de poner esto en APC? No tengo que jugar con los permisos de archivos y no habrá nada abarrotado en mi disco (solo en el almacenamiento de la memoria). –

Cuestiones relacionadas