keszowanie stron WWW

Keszowanie stron WWW zostało stworzone z myślą o dynamicznych serwisach WWW. Kiedyś strony statyczne królowały w internecie, natomiast strony dynamiczne posiadały jedynie bardzo bogate firmy, ewentualnie firmy, które bez takich stron nie byłyby w stanie przetrwać na rynku. Obecnie zdecydowana większość stron jest dynamiczna.

Po co keszować strony WWW

Niemalże każda strona posiada bazę danych i to z niej jest pobierana większość informacji, które później są wyświetlane na stronie. Podejrzewam, że baza danych MySQL jest wykorzystywana przez ok 99 procent stron. Wiele firm hostingowych oferuje serwery wirtualne, które mają nałożone limity zużycia mocy procesora. Kiedy w serwisie jest użyjemy keszowania stron WWW, przekroczenie tych norm Nam nie grozi.

Każde wykonanie zapytania wiąże się z zaprzęgnięciem do pracy procesora oraz innych zasobów serwera. W pamięci gromadzone są wyniki zapytań, wartości zmiennych używanych w skryptach itd. Oczywiście pamięć na końcu skryptu jest zwalniana, jednak nadal jest w to mocno zaangażowana. Podobnie jest z mocą obliczeniową procesora.

Każde wygenerowanie strony wiąże się z pobraniem danych z bazy danych, przetworzeniem ich przez procesor i stworzeniem strony wynikowej, która nie raz jest dosyć skomplikowana. A gdyby tak odciążyć pamięć oraz procesor i sprawić, by odetchnęli z ulgą? Strony szybciej by się ładowały, a zasoby serwera zostałyby użyte tylko w niewielkim stopniu.

Keszowanie stron internetowych pomaga Nam to osiągnąć i ze stron dynamicznych zrobić strony statyczne. Kiedy potrzebna jest jakaś strona, której nie ma w keszu, skrypt ją generuje. Na końcu działania skryptu przechwytujemy to co zostało wygenerowane i zapisujemy do odpowiedniego pliku. Przy następnym wywołaniu sprawdzamy tylko, czy taka strona została już wcześniej wygenerowana i jeśli jest, to wyświetlamy zapisaną stronę. Jeśli nie ma, to powtarzamy całą procedurę.

Elementy niezbędne przy keszowaniu stron WWW

Aby tego dokonać, będziemy potrzebowali paru funkcji, które udostępnia Nam PHP:

  • ob_start – ta funkcja inicjuje przechwytywanie danych, które są generowane przez PHP
  • ob_get_contents – zwraca zawartość bufora
  • ob_end_clean – wyłącza przechwytywanie danych i czyści bufor
  • file_get_contents – pobiera zawartość pliku
  • file_put_contents – zapisuje dane do pliku
  • md5 – pomoże wygenerować unikalną nazwę pliku w zależności od otrzymanych danych ($_GET i $_POST)
  • json_encode – konwertowanie danych do formatu JSON
  • json_decode – konwertowanie danych z formatu JSON
  • glob – pobieranie do zmiennej zawartości katalogu

Ta lista funkcji na pewno zadziwiła nie jedną osobę. Dla przykładu weźmy funkcję glob. Wydaje się, że ta funkcja jest tutaj zbędna. Jednak po dłuższym zastanowieniu, okazuje się, że ta funkcja przydaje się, kiedy będziemy chcieli usunąć zgromadzone na dysku pliku z keszem.

Kolejnym przykładem jest funkcje json_encode. Po co konwertować dane do formatu, który w niczym się nie przyda? Niestety prawda jest taka, że coraz częściej na stronach jest wykorzystywana technologia AJAX (sam jestem jej zwolennikiem), a format JSON jest używany do wymiany danych między skryptami wykonywanymi po stronie serwera, a skryptami wykonywanymi po stronie klienta. Część ludzi stwierdzi w tej chwili, że XML jest o wiele lepszy.

Niestety XML ma pewne ograniczenia. Problemy może stworzyć przekazanie XML-em tablicy n-wymiarowej. Trzeba by specjalnie kombinować. Poza tym i tak za każdym razem trzeba by dostosowywać dane do XML-a, co nie byłoby łatwe. Poza tym operowanie danymi w XMLu przysparza trochę problemów. Trzeba używać elementy PHP, które wspomagają obsługę XML. Z JSON-em jest o wiele łatwiej. Jedną funkcją z ciągu znaków robimy dowolny typ danych. Dzięki temu formatowi odwzorowanie w JavaScript danych z PHP jest banalnie proste i wymaga użycia dwóch funkcji – jedna po każdej.

Funkcje wykorzystane podczas keszowania stron WWW

Teraz przejdźmy do samego keszowania. Do keszowania użyjemy paru funkcji:

  • tworzKesz(nazwaPliku, dane) – funkcja będzie odpowiedzialna za stworzenie keszu o podanej nazwie z podanych danych
  • pobierzKesz(nazwaPliku) – ta funkcja będzie zwracać pobraną zawartość keszu lub FALSE w przypadku braku pliku
  • usunKesz(nazwaPliku) – ta funkcja będzie usuwać kesz (jeśli nie będzie podanej nazwy pliku, to zostanie usunięty cały kesz
define('KATALOG_KESZU','katalog_w_którym_będzie_trzymany_kesz/');
define('ROZSZERZENIE_KESZU','.rozszerzenie_pliku_z_keszem');
tworzKesz($nazwaPliku, $dane, $katalog=''){
  if($katalog){
    if(substr($katalog,-1)!='/'){
      $katalog.='/';
    }
  }else{
    $katalog=KATALOG_KESZU;
  }
  return file_put_contents($katalog.$nazwaPliku.ROZSZERZENIE_KESZU, json_encode($dane));
}
pobierzKesz($nazwaPliku, $katalog=''){
  if($katalog){
    if(substr($katalog,-1)!='/'){
      $katalog.='/';
    }
  }else{
    $katalog=KATALOG_KESZU;
  }
  if(!file_exists($katalog.$nazwaPliku.ROZSZERZENIE_KESZU)){
    return false;
  }
  return file_get_contents(json_decode($katalog.$nazwaPliku.ROZSZERZENIE_KESZU, true));
}
usunKesz($nazwaPliku='', $katalog=''){
  if($katalog){
    if(substr($katalog,-1)!='/'){
      $katalog.='/';
    }
  }else{
    $katalog=KATALOG_KESZU;
  }
  if($nazwaPliku && file_exists($katalog.$nazwaPliku.ROZSZERZENIE_KESZU)){
    return unlink($katalog.$nazwaPliku.ROZSZERZENIE_KESZU);
  }
  $nazwaPliku=glob($katalog.'*');
  if($nazwaPliku){
    foreach($nazwaPliku AS $plik){
      if(!unlink($plik)){
        return false;
      }
    }
  }
  return true;
}

Jak zauważyliście, w funkcjach użyłem zmienną $katalog. Czasami są sytuacje, kiedy musimy zapisać lub odczytać kesz z innego katalogu niż domyślny. Stała jest użyta tylko wtedy, kiedy w funkcje zostają wywołane bez zmiennej definiującej katalog.

Używanie funkcji keszujących strony WWW

Używanie tych funkcji jest banalnie proste.

Jeśli chcemy zapisać jakieś dane w keszu, to po prostu piszemy

if(!tworzKesz('nazwaPliku',$dane)){
  echo 'Nie udało się zapisać keszu';
}

Pobieranie danych z keszu odbywa się podobnie.

$dane=pobierzKesz('nazwaPliku');
if($dane===false){
  echo 'Nie udało się pobrać keszu';
}

Usuwanie keszu jest bardzo podobne do zapisywania danych

if(!usunKesz('nazwaPliku')){
  echo 'Nie udało się usunąć keszu';
}

Jak widzicie, keszowanie stron WWW nie jest czymś trudnym i każdy jest w stanie sobie z tym poradzić.

Twitter Obserwuj mnie na Blip.pl 

Dodaj komentarz

Twój komentarz

CommentLuv badge