PHP: cache strony

Autor: Arkadiusz Tobiasz 2 lutego 2011

Wraz z rozwojem naszej strony i rosnącą liczbą użytkowników może dojść do sytuacji, w której serwer z którego korzystamy będzie miał kłopoty z obsługiwaniem wzmożonego ruchu. Jak wiadomo dynamiczne skrypty PHP korzystające w dodatku z bazy danych znacznie bardziej obciążają serwer niż statyczne strony napisane w HTML. Jeżeli masz problemy z nadmiernym obciążeniem serwera, a nie stać Cię na lepszy hosting, to z pomocą może przyjść cache’owanie stron WWW.

Pliki HTML zawierające obraz naszych skryptów PHP, czyli tzw. cache będziemy zapisywać w folderze o nazwie cache. Folderowi należy nadać odpowiednie prawa, chmod 777.

W tym celu najlepiej umieścić w pliku nagłówkowym, np. header.php (o ile chcemy zastosować cache dla wszystkich podstron serwisu, jeżeli chcemy cache’ować tylko stronę główną, to modyfikujemy tylko jeden plik) następujący kod:

1
2
3
4
5
6
7
8
9
$script = md5($_SERVER['REQUEST_URI']);
$cachefile = 'cache/'.$script.'.html';
$cachetime = 15 * 60;

if (file_exists($cachefile) && (time() - $cachetime < filemtime($cachefile))) {
    include($cachefile);
    echo "<!-- Cached ".date('jS F Y H:i', filemtime($cachefile))." -->";
    exit;
}

W pierwszej linijce kodujemy algorytmem md5 zmienną, która zazwyczaj jest nazwą pliku PHP. Następnie tworzymy zmienną ze ścieżką do pliku z cachem i zmienną określającą ważność cache’a, w tym wypadku 15 minut. Jeżeli plik istnieje i został stworzony do dwóch godzin, to jest wyświetlany plik HTML i pozostałe działanie skryptu jest przerywane za pomocą exit().

Pozostaje jeszcze kwestia zapisywania bieżącej zawartości strony jako plik HTML. w tym celu na samym końcu strony, zazwyczaj w pliku footer.php przed tagiem zamykającym ?> umieszczamy kod:

1
2
3
$fp = fopen($cachefile, 'w');
fwrite($fp, ob_get_contents());
fclose($fp);

Kolejno otwieramy plik do zapisu, a następnie nadpisujemy jego zawartość obecną zawartością skryptu PHP.

W taki oto sposób, co dwie godziny jest robiony cache’a danej strony i użytkownikom jest wyświetlany plik HTML zamiast skryptu PHP. Oczywiście jeżeli zawartość strony się częściej zmienia, to można skrócić okres ważności cache’a.

komentarze 2

  1. Matek napisał(a):

    A co jeśli ktoś zażąda pliku
    cache/skrypt.html
    w tym samym czasie kiedy będzie on tworzony funkcją fwrite() ?
    Jak zapobiec takiej kolizji?

    • Arkadiusz Tobiasz napisał(a):

      Strona główna musiałaby być bardzo duża, aby taka sytuacja miała miejsce, bądź serwer kiepski.

      W takiej sytuacji najlepiej dodać kolejny warunek, że jeśli w zawartości istniejącego pliku jest tag

      1
      </html>

      to ma wyświetlać cache, a jeśli nie wykrywa tego tagu, to ma wyświetlić stronę normalnie,

Odpowiedz

 

Arkadiusz Tobiasz student Akademii Ekonomicznej im. Karola Adamieckiego w Katowicach na specjalnościach informatyka ekonomiczna oraz rachunkowość. Więcej...

jQuery Validation i funkcja remote

Jakiś czas temu zwrócił się do mnie użytkownik z problemem. Chodzi o to, że korzysta on z pluginu walidacji jQuery, […]

Zend Framework: integracja z Uploadify

W tym wpisie postaram się przedstawić Wam w jaki sposób zintegrować skrypt Uploadify z Zend Frameworkiem. Dzięki temu będziemy mogli […]

Javascript: Czasowe wyświetlanie reklamy

Czasami chcemy, aby na pewnym elemencie naszej strony wyświetlała się reklama przez jakiś czas, a następnie zniknęła. W tym wpisie […]

Linux: backup wszystkich baz danych MySQL

Swego czasu pisałem o tym jak z poziomu konsoli można szybko i przyjemnie zrobić backup bazy MySQL. Wszystko jest ładnie […]