2013-04-01 9 views
11

każdym razem, gdy ktoś ląduje na mojej stronie list.php?id=xxxxx to requeries kilka zapytań MySQL, aby powrócić to:Najprostszy sposób buforowania wyników zapytania MySQL za pomocą 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 

Ponieważ baza danych, z której robię zapytania jest dość duży Chciałabym buforować wynika to przez 24h w być może plik taki jak: xxxxx.php w katalogu/cache /, więc mogę go użyć w include("xxxxx.php"), jeśli jest obecny. (lub pliki txt!? lub w jakikolwiek inny sposób)

Ponieważ istnieje bardzo proste dane uważam, że można to zrobić za pomocą kilku linii PHP i nie trzeba używać memcached lub innych profesjonalnych obiektów.

Becasuse mój PHP jest bardzo ograniczony może ktoś po prostu umieścić główne linie PHP (lub kod) do tego zadania?

Naprawdę byłbym bardzo wdzięczny!

+0

Zmodyfikowałem odpowiedź, aby dodać rozwiązanie dla 24 godzinnej ważności pamięci podręcznej. Zobacz http://stackoverflow.com/a/15748442/369005 –

Odpowiedz

8

Buforowanie tablicy PHP jest całkiem proste:

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

Następnie można go odczytać z powrotem:

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

kupili także do look into ADOdb, który zapewnia buforowanie wewnętrznie.

+0

Dziękujemy za umieszczenie w ten sposób podejścia do tego problemu. To wskazało mi na zbudowanie prostego rozwiązania dla mojej sprawy! –

0

Wystarczy napisać nowy plik o nazwie $ _GET ['id'] i zawartość rzeczy, które chcesz przechowywać w pamięci podręcznej, i za każdym razem, aby sprawdzić, czy plik istnieje, w przeciwnym razie należy go utworzyć. Coś takiego:

$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); 
} 
+3

A potem ktoś dzwoni do twojego skryptu z 'script.php? Id = ../../etc/passwd' lub czymś innym śmiesznym. Sanityzuj dane wprowadzane przez użytkownika ... – DCoder

+0

Ty lemondrop; ponieważ rozumiem, że sam plik nie ma żadnego rozszerzenia, prawda? Jak mogę umieścić moje 3 elementy (2 tablice + 1 zmienna) w danych $? Także jeśli mógłbyś mi zapewnić sposób sprawdzenia pamięci podręcznej 24h, to byłoby wspaniale !! –

5

Spróbuj użyć serializowania;

Załóżmy, że masz dane w dwóch tablicach $array1 i $array2. Teraz musisz zapisać te tablice w pliku. Przechowywanie łańcucha (trzecia zmienna w twoim pytaniu) do pliku jest łatwe, ale aby przechowywać tablicę, musisz ją najpierw przekonwertować na ciąg.

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

Kolejnym problemem jest nazewnictwo plików pamięci podręcznej, dzięki czemu można łatwo sprawdzić, czy odpowiednia tablica jest już dostępna w pamięci podręcznej. Najlepszym sposobem jest utworzenie skrótu MD5 zapytania mysql i użycie go jako nazwy pliku pamięci podręcznej.

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

Powtórz powyższe z drugiej tablicy, które powinny być przechowywane w oddzielnym pliku z MD5 drugiego zapytania używany jako nazwa drugiego pliku cache.

W końcu musisz zdecydować, jak długo pamięć podręczna powinna pozostać ważna. W przypadku tego samego zapytania może nastąpić zmiana rekordów w tabeli mysql, co może spowodować, że pamięć podręczna systemu plików będzie nieaktualna. Tak więc nie można polegać tylko na unikalnych nazwach plików dla unikalnych zapytań.

Ważne:

  • stare pliki cache muszą być usunięte. Być może trzeba będzie napisać procedurę, która sprawdza wszystkie pliki w katalogu i usuwa pliki starsze niż n sekund.
  • Zachowaj katalog pamięci podręcznej poza webrootem.
+0

Myślisz, że to mam. Spróbuję go zaimplementować zgodnie z opisanymi krokami. Wielkie dzięki, Hamid. –

Powiązane problemy