Il modo più semplice per memorizzare i risultati delle query MySQL usando PHP?

Ogni volta che qualcuno entra nella mia pagina list.php?id=xxxxx esegue una query su alcune query MySQL per restituire questo:

 $ids = arrays(..,..,..); // not big arrays - not longer then 50 number records $thumbs = arrays(..,..,..); // not big arrays - 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 memorizzare questi risultati per 24 ore in 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 PHP (o il codice) per questa attività?

Sarei davvero molto grato!

Il caching di un arrays PHP è piuttosto semplice:

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

Quindi puoi leggerlo di nuovo:

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

Si potrebbe anche voler esaminare ADOdb , che fornisce il caching internamente.

Prova ad usare serializzare;

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

 $string_of_arrays1 = serialize( $arrays1 ); $string_of_arrays2 = serialize( $arrays2 ); 

Il prossimo problema è la denominazione dei file di cache in modo che sia ansible verificare facilmente se l'arrays pertinente è 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 ) ) { $arrays1 = unserialize( file_get_contents( $cache_dir . $cache1_filename ) ); } } if( !isset( $arrays1 ) ) { $arrays1 = run_mysql_query( $query1 ); file_put_contents( serialize( $arrays1 ) ); } 

Ripetere l'operazione precedente con l'altro arrays che deve essere archiviato in un file separato con MD5 della seconda query utilizzata come nome del secondo file di cache.

Alla fine, devi decidere per quanto tempo la tua cache dovrebbe 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.

Importnte:

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

Basta scrivere un nuovo file con il nome di $ _GET ['id'] e il contenuto della roba che si desidera memorizzare nella cache, e each volta controllare per vedere se quel file esiste, altrimenti crearne uno. Qualcosa come questo:

 $id = $_GET['id'] if (file_exists('/a/dir/' . $id)) { $data = file_get_contents('/a/dir/' . $id); } else { //do mysql query, set data to result $handle = fopen('/a/dir/' . $id, 'w+'); fwrite($handle, $data); fclose($handle); }