Kontrolowanie czasu sesji w PHP

Potrzebowałem ostatnio wydłużyć czas trwania sesji, znacznie ponad standardowe 24 minuty. Jak wiemy, mechanizm sesji umożliwia przechowywanie na serwerze danych dotyczących klientów(przeglądarek), które dostępne są przy każdym żądaniu. Połączenie pomiędzy sesją na serwerze a klientem realizowane jest poprzez ciasteczko, które przechowuje id sesji. Wydłużanie czasu trwania sesji nie jest najlepszym pomysłem, ze względu na większe prawdopodobieństwo przechwycenia sesji przez nie uprawnione osoby, tzw. session hijacking. Serwer nie potrafi rozróżnić uprawnionego klienta od nieuprawnionego i jedyna obroną przez przechwyceniem jest usuwanie sesji, które były nieaktywne przez określony czas. Mechanizm, który realizuje usuwanie nieaktywnych sesji nazywa się garbage collection. Każdorazowe użycie sesji powoduje zaktualizowane czasu jej ostatniego użycia. Sesja jest niszczona po przekroczeniu czasu od ostatniego użycia + czas trwania sesji. Domyślny czas trwania sesji to 1440 sekund, czyli 24 minuty.

Pierwszą zmienną, która nas interesuje jest session.gc_maxlifetime. Definiuje ona liczbę sekund, po których sesja zostanie uznana za nie aktywną i zostanie usunięta. Mechanizm garbage collection może być również uruchomiony przy wywołaniu funkcji session_start(). Prawdopodobieństwo jego uruchomienia wyliczane jest z dwóch kolejnych zmiennych: session.gc_probability / session.gc_divisor. Pierwsza zmienna domyślnie ustawiona jest na 1, druga na 100 co daje 1% szans na uruchomienie mechanizmu. Kolejną kwestią jest miejsce, w którym przechowujemy sesje na serwerze. Jeżeli użyjemy tego samego folderu dla wszystkich sesji to czasy ich trwania zostaną ustawione na czas trwania najkrótszej sesji. Musimy utworzyć nowy folder a ścieżkę do niego ustawić w zmiennej session.save_path.

function my_session_start($timeout = 24, $probability = 100, $cookie_domain = '/') {
  // czas trwania sesji na serwerze
  ini_set("session.gc_maxlifetime", $timeout);
  // czas życia ciasteczka po stronie klienta
  ini_set("session.cookie_lifetime", $timeout);
 
  // tworzymy osobny folder dla sesji o podobnym czasie trwania
  $path = ini_get("session.save_path") . DIRECTORY_SEPARATOR . "session_" . $timeout;
  if (!file_exists($path)) {
    if (!mkdir($path, 600)) {
      trigger_error("Błąd utworzenia katalogu sesji: '$path'", E_USER_ERROR);
    }
  }
  // wskazujemy ścieżkę do folderu
  ini_set("session.save_path", $path);
 
  // ustawienia dla mechanizmu garbage collection
  ini_set("session.gc_probability", $probability);
  ini_set("session.gc_divisor", 100); 
 
  // uruchamiamy sesję
  session_start();
 
  // możemy również, ustawiać czas sesji od nowa przy każdym odświeżeniu skryptu
  // poprzez każdorazowe ustawianie ciasteczka z nowym czasem życia
  if (isset($_COOKIE[session_name()])) {
    setcookie(session_name(), $_COOKIE[session_name()], time() + $timeout, $cookie_domain);
  }
}

Profilowanie aplikacji PHP

Pisząc aplikację projektujemy strukturę bazy danych, ustalamy strukturę linków, tworzymy scenariusze użycia. Tak zaplanowana aplikacja działa bardzo dobrze do momentu, w którym zaczynamy wprowadzać zmiany, dodawać nowe funkcjonalności, np. w skutek wzrostu popularności serwisu. Nie przemyślane zmiany, odbiegające od pierwotnej koncepcji, często robione przez innego programiste powodują, że nasz skrypt zaczyna działać niestabilnie, długo i ma spore zapotrzebowanie na pamięć.

W wyprowadzeniu skryptu „na prostą” pomoże nam Xdebug Profiler i KCachegrind. Profiler dostarczy nam informacji o tym, jakie pliki wywoływane są przy każdym żądaniu, ile czasu serwer spędza na każdym pliku, każdej funkcji lub metodzie oraz ile razy jest ona wywoływana w skrypcie. Te właśnie informacje pomogą nam w diagnozowaniu wąskich gardeł czy nawet zapętleń w skryptach. W analizie tych danych pomoże nam KCachegrind, który całą strukturę skryptu z zebranymi danymi zobrazuje w postaci grafu. Teraz możemy przystąpić do optymalizacji, która często prowadzi do refaktoringu.

PHPCon 2011 PL

„Obecność za rok obowiązkowa :)” – tak :) I w tym roku miałem okazję uczestniczyć w konferencji PHPCon, która odbyła się w hotelu „Przedwiośnie” w miejscowości Mąchocice Kapitulne k/Kielc w dniach 21-23 października. Wrażenie, które odniosłem po tej konferencji jest dość kiepskie, głównie za sprawą samych uczestników, wśród których wystąpiło jakieś ogólne rozprężenie – rozmowy i szmery na sali. Prelekcje nie były co prawda tak interesujące jak rok temu – to jednak nie usprawiedliwia takiego zachowania. Więcej wiadomości wyniosłem z pierwszej edycji i miałem większy entuzjazm do robienia nowych rzeczy. Tu natomiast można było dowiedzieć się co aktualnie dzieje się w świecie PHP i dokąd to wszystko zmierza.