2013-04-01 15 views
11

Ogni volta che qualcuno atterra nella mia pagina list.php?id=xxxxx si requeries alcune query MySQL per restituire questo:Il modo più semplice per memorizzare nella cache i risultati delle query MySQL usando PHP?

$ids = array(..,..,..); // not big array - not longer then 50 number records 
$thumbs = array(..,..,..); // not big array - not longer then 50 text records 
$artdesc = "some text not very long"; // text field 

Poiché il database da cui faccio le query è abbastanza grande vorrei mettere in cache questo si traduce in 24 ore in forse un file come: xxxxx.php in una directory/cache/così posso usarlo in include("xxxxx.php") se è presente. (o file txt!?, o in qualsiasi altro modo)

Dato che ci sono dati molto semplici, credo che si possa fare usando alcune linee PHP e senza bisogno di usare memcached o altri oggetti professionali.

Perché il mio PHP è molto limitato, qualcuno può semplicemente posizionare le linee principali (o il codice) PHP per questa attività?

Sarei davvero molto grato!

+0

Ho modificato la risposta per aggiungere la soluzione per la validità della cache di 24 ore. Vedi http://stackoverflow.com/a/15748442/369005 –

risposta

8

Cache di un array PHP è piuttosto semplice:

file_put_contents($path, '<?php return '.var_export($my_array,true).';?>'); 

Poi si può leggere di nuovo fuori:

if (file_exists($path)) $my_array = include($path); 

Si potrebbe anche voler look into ADOdb, che fornisce la cache internamente.

+0

Mille grazie per aver scelto questa soluzione per affrontare questo problema. Mi ha suggerito di costruire una soluzione semplice per il mio caso! –

0

Basta scrivere un nuovo file con il nome di $ _GET ['id'] e il contenuto delle cose che si desidera memorizzare nella cache, e ogni volta controllare per vedere se quel file esiste, altrimenti crearne uno. Qualcosa del genere:

+3

E poi qualcuno chiama il tuo script con 'script.php? Id = ../../etc/passwd' o qualcos'altro divertente. Disinfetta l'input dell'utente ... – DCoder

+0

Ty lemondrop; per quello che capisco il file stesso non ha alcuna estensione, giusto? Come posso inserire i miei 3 elementi (2 array + 1 variabile) nei dati $? Anche se potessi fornirmi il modo di controllare la cache 24 ore sarebbe fantastico !! –

5

Provare a utilizzare serializzare;

Supponiamo di avere i dati in due array $array1 e $array2. Ora quello che devi fare è archiviare questi array nel file. Memorizzare una stringa (la terza variabile nella tua domanda) in un file è facile, ma per memorizzare un array devi prima convertirlo in stringa.

$string_of_array1 = serialize($array1); 
$string_of_array2 = serialize($array2); 

Il problema successivo è la denominazione dei file di cache in modo che si può facilmente controllare se la matrice in questione è già disponibile nella cache. Il modo migliore per farlo è creare un hash MD5 della tua query mysql e usarlo come nome file cache.

$cache_dir = '/path/cache/'; 

$query1 = 'SELECT many , fields FROM first_table INNER JOIN another_table ...'; 
$cache1_filename = md5($query1); 

if(file_exists($cache_dir . $cache1_filename)) 
{ 
    if(filemtime($cache_dir . $cache1_filename) > (time() - 60 * 60 * 24)) 
    { 
     $array1 = unserialize(file_get_contents($cache_dir . $cache1_filename)); 
    } 
} 

if(!isset($array1)) 
{ 
    $array1 = run_mysql_query($query1); 
    file_put_contents(serialize($array1)); 
} 

Ripetere quanto sopra con l'altra matrice che deve essere memorizzata in un file separato con MD5 della seconda query utilizzata come nome del secondo file cache.

Alla fine, è necessario decidere per quanto tempo la cache deve rimanere valida. Per la stessa query, potrebbero essere modificati i record nella tabella mysql che potrebbero rendere la cache del file system obsoleta. Quindi, non puoi fare affidamento solo su nomi di file univoci per query uniche.

Importante:

  • I vecchi file di cache devono essere eliminati. Potrebbe essere necessario scrivere una routine che controlli tutti i file di una directory e cancelli i file più vecchi di n secondi.
  • Mantiene la cache dir fuori dalla radice del web.
+0

Penso di averlo capito. Cercherò di implementarlo seguendo i passaggi che descrivi. Molte grazie Hamid. –

Problemi correlati