Użycie Memcached do buforowania danych PHP w ServBay
ServBay jako zaawansowane lokalne środowisko programistyczne dla WWW zawiera preinstalowany, wydajny pakiet Memcached (serwer Memcached) oraz odpowiednie rozszerzenie PHP. Dzięki temu deweloperzy mogą w prosty sposób zaimplementować efektywne buforowanie danych w aplikacjach PHP i znacząco zwiększyć ich wydajność.
W tym artykule szczegółowo wyjaśnimy, jak sprawdzić oraz wykorzystać Memcached i jego rozszerzenie PHP w środowisku ServBay.
Wprowadzenie do Memcached
Memcached to wydajny, rozproszony system buforowania obiektów w pamięci. Tymczasowo przechowuje dane w RAM-ie (np. wyniki zapytań do bazy, odpowiedzi z API, fragmenty stron itp.), dzięki czemu ogranicza liczbę odwołań do bazowych źródeł danych (np. bazy danych), przyspieszając działanie dynamicznych aplikacji webowych i zwiększając przepustowość.
Kluczowe cechy
- Wysoka wydajność: Przechowywanie danych w pamięci zapewnia błyskawiczny odczyt i zapis.
- Rozproszenie: Obsługa wielu serwerów pozwala tworzyć rozproszony klaster cache, który łatwo skalować.
- Prostota użycia: Łatwy protokół, bogata oferta bibliotek klienckich i prosta integracja.
- Zmniejszenie obciążenia bazy danych: Efektywnie odciąża bazę danych, szczególnie przy dużym natężeniu ruchu.
Różnica pomiędzy rozszerzeniami PHP memcache
i memcached
W PHP dostępne są dwa najpopularniejsze rozszerzenia do komunikacji z serwerem Memcached: memcache
i memcached
. Choć nazwy są podobne, są to dwa odrębne rozszerzenia oferujące różne API oraz funkcjonalności:
Rozszerzenie
memcache
:- Starsze rozszerzenie PHP.
- Udostępnia głównie interfejs proceduralny (
memcache_connect()
,memcache_set()
, itd.). - Oferuje podstawowe funkcje, nie obsługuje zaawansowanych możliwości jak konsystentny hasz (niektóre biblioteki klienckie wdrażają go na własną rękę).
Rozszerzenie
memcached
:- Nowsze rozszerzenie (korzysta z biblioteki libmemcached).
- Zapewnia interfejs obiektowy (klasa
Memcached
). - Obsługuje wiele funkcji zaawansowanych, takich jak konsystentny hasz, protokół binarny, uwierzytelnianie SASL, bardziej elastyczne opcje serializacji itd.
- Najczęściej zalecane do użytku, ponieważ jest bardziej rozbudowane i aktywnie rozwijane.
W ServBay domyślnie dostępne i rekomendowane jest bogatsze rozszerzenie memcached
dla PHP.
Pakiet Memcached i rozszerzenie PHP w środowisku ServBay
ServBay integruje nie tylko serwer Memcached jako konfigurowalny pakiet, ale w każdej zainstalowanej wersji PHP jest już preinstalowane i domyślnie włączone rozszerzenie memcached
.
To oznacza, że w większości przypadków po zainstalowaniu ServBay serwer Memcached oraz jego rozszerzenie PHP są gotowe do użytku bez dodatkowej kompilacji czy konfiguracji PHP.
Sprawdzenie stanu pakietu Memcached:
Pakiet Memcached
znajdziesz w głównym panelu ServBay lub w menedżerze pakietów – upewnij się, czy jego status to "uruchomiony". Jeśli nie, spróbuj go uruchomić.
Weryfikacja, czy rozszerzenie PHP memcached
zostało załadowane:
Aby sprawdzić, czy konkretna wersja PHP poprawnie ładuje rozszerzenie memcached
, najprościej użyć funkcji phpinfo()
:
Stwórz plik PHP w katalogu głównym swojej strony na ServBay (domyślnie
/Applications/ServBay/www
), np.info.php
.Dodaj do niego poniższy kod:
php<?php phpinfo(); ?>
1
2
3Otwórz ten plik przez przeglądarkę, korzystając z lokalnego adresu skonfigurowanego w ServBay (np. jeśli Twoja domena to
servbay.demo
, odwiedźhttp://servbay.demo/info.php
).Na wygenerowanej stronie
phpinfo
wyszukaj słowo "memcached". Jeśli znajdziesz sekcję o tej nazwie z parametrami konfiguracyjnymi i numerem wersji, to znaczy, że rozszerzenie działa poprawnie i jest dostępne.
Korzystanie z Memcached w PHP
Po upewnieniu się, że serwer Memcached działa i rozszerzenie PHP memcached
jest załadowane, możesz użyć klasy Memcached
w swoim kodzie PHP do łączenia się z serwerem i wykonywania operacji cache'ujących.
Domyślnie serwer Memcached nasłuchuje na localhost
na standardowym porcie 11211
.
Przykład kodu
Poniżej znajdziesz prosty przykład w PHP prezentujący, jak użyć klasy Memcached
do połączenia z lokalnym serwerem Memcached, a następnie ustawienie i pobranie danych:
Zapisz poniższy kod jako plik PHP w katalogu strony ServBay (np. /Applications/ServBay/www/memcached_test.php
):
php
<?php
// Informacje o serwerze Memcached
$memcached_host = 'localhost';
$memcached_port = 11211;
// Tworzenie instancji klienta Memcached
$memcached = new Memcached();
// Dodanie serwera Memcached do puli połączeń klienta
// Metoda addServer() zwraca wartość bool, informuje czy adres został dodany, a nie czy połączenie się powiodło
if (!$memcached->addServer($memcached_host, $memcached_port)) {
// Uwaga: addServer zwykle zawodzi przez błędną konfigurację, a nie problem z połączeniem z serwerem
die("Nie można dodać serwera Memcached do listy połączeń klienta. Sprawdź konfigurację hosta i portu.");
}
// Próba pobrania nieistniejącego klucza w celu przetestowania połączenia (opcjonalnie, ale zalecane)
// get() zwraca false lub pustą tablicę przy braku klucza lub problemach z połączeniem
// Memcached::getResultCode() umożliwia uzyskanie szczegółowego kodu statusu
$test_key = 'servbay_memcached_connection_test';
$memcached->get($test_key); // Próba pobrania nieistniejącego klucza
$result_code = $memcached->getResultCode();
if ($result_code !== Memcached::RES_NOTFOUND && $result_code !== Memcached::RES_SUCCESS) {
// Jeżeli to nie RES_NOTFOUND ani RES_SUCCESS, prawdopodobnie połączenie jest nieudane
// Uwaga: RES_SUCCESS może się pojawić przy pobraniu pustej wartości
// Bardziej szczegółowa kontrola wymaga zaawansowanej logiki lub specyficznej obsługi klienta
// W środowisku developerskim, jeśli addServer się powiodło i kolejne operacje nie zgłaszają błędów, połączenie uznaje się za poprawne
echo "Uwaga: mogą występować problemy z połączeniem z serwerem Memcached. Result Code: " . $result_code . "<br>";
// W produkcji wymagane może być bardziej szczegółowe logowanie błędów
} else {
echo "Pomyślnie połączono z serwerem Memcached ({$memcached_host}:{$memcached_port}).<br>";
}
// --- Przykłady operacji na cache ---
// Dane do zapisania w cache
$key = 'user_profile_1234';
$data = [
'id' => 1234,
'username' => 'servbay-demo',
'email' => 'demo@servbay.test',
'status' => 'active'
];
$expiration = 3600; // Czas wygaśnięcia cache w sekundach (tutaj 1 godzina)
// Ustawienie danych w cache
// set() zwraca bool, informuje czy operacja się powiodła
if ($memcached->set($key, $data, $expiration)) {
echo "Dane pomyślnie zapisane w Memcached pod kluczem '{$key}', wygaśnie za {$expiration} sekund.<br>";
} else {
echo "Nie udało się zapisać danych w cache!<br>";
// Przyczynę można pobrać przez $memcached->getResultCode()
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
// Próba pobrania danych z cache
echo "Próba pobrania danych z cache...<br>";
$cachedData = $memcached->get($key);
if ($cachedData !== false) { // Memcached::get() zwraca false, jeśli cache nie trafiono lub wystąpił błąd
echo "Dane pobrane z cache:<br>";
echo "<pre>";
print_r($cachedData);
echo "</pre>";
} else {
echo "Brak danych w cache lub błąd pobierania, klucz '{$key}'.<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
// Przykład co się dzieje po wygaśnięciu cache (załóżmy, że upłynął czas)
// W praktyce sprawdzasz czy $cachedData jest false, jeśli tak, pobierasz dane ze źródła (np. bazy) i zapisujesz do cache
// Przykład: usunięcie danych z cache
/*
echo "Próba usunięcia danych z cache...<br>";
if ($memcached->delete($key)) {
echo "Dane zostały usunięte z cache, klucz '{$key}'.<br>";
} else {
echo "Nie udało się usunąć danych z cache!<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
// Ponowna próba pobrania usuniętych danych
echo "Ponowna próba pobrania usuniętych danych...<br>";
$cachedDataAfterDelete = $memcached->get($key);
if ($cachedDataAfterDelete !== false) {
echo "Dane wciąż w cache (usunięcie nie powiodło się):<br>";
print_r($cachedDataAfterDelete);
} else {
echo "Danych nie ma już w cache (zgodnie z oczekiwaniem).<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
*/
// Przykład: wyczyszczenie całego cache (ostrożnie!)
/*
echo "Próba wyczyszczenia całego cache...<br>";
if ($memcached->flush()) {
echo "Cały cache został wyczyszczony.<br>";
} else {
echo "Nie udało się wyczyścić cache!<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
*/
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
Odwiedzając plik memcached_test.php
przez lokalną stronę skonfigurowaną w ServBay, zobaczysz wyniki testów połączenia, zapisania oraz pobierania danych z cache.
Ważne uwagi
- Upewnij się, że pakiet Memcached w ServBay ma status uruchomiony.
- Domyślnie Memcached nasłuchuje na
127.0.0.1
(lublocalhost
) na porcie11211
— przeważnie nie wymaga to zmiany. - Jeśli połączenie z PHP się nie powiedzie, sprawdź status pakietu Memcached oraz ewentualną konfigurację zapory sieciowej.
- Metoda
addServer
klasyMemcached
jedynie dodaje serwer do listy, nie nawiązuje trwałego połączenia ani nie sprawdza natychmiast dostępności. Faktyczne połączenia i operacje zachodzą przy późniejszych wywołaniach np.get
,set
. Ocenić powodzenie można na podstawie zwracanych wartości tych operacji lub kodów statusu z metodygetResultCode()
.
Podsumowanie
ServBay zapewnia deweloperom niezwykle łatwy sposób korzystania z Memcached. Dzięki integracji serwera Memcached oraz preinstalowanemu i domyślnie aktywnemu rozszerzeniu PHP memcached
nie musisz wykonywać skomplikowanej instalacji ani konfiguracji, by od razu korzystać z wydajnego buforowania danych w swoim lokalnym środowisku. To solidna podstawa do tworzenia szybkich i skalowalnych aplikacji PHP.