Często pomijanym sposobem na przyspieszenie żądań PHP jest PHP Realpath Pamięć podręczna: przechowuje rozpoznane ścieżki w pamięci operacyjnej i ogranicza kosztowne zapytania do systemu plików podczas stosowania instrukcji `include`/`require`. W projektach opartych na Symfony, Laravel lub rozbudowanej konfiguracji WordPressa, dzięki starannemu skonfigurowaniu `Realpath` zwiększam Wydajność jest to mierzalne, a liczba wywołań systemowych na żądanie jest znacznie niższa.
Punkty centralne
- Prostsze Hebel: Realpath zapisuje wyniki rozdzielania ścieżek i ogranicza liczbę operacji dostępu do systemu plików.
- Na pracownika: Każdy proces PHP-FPM zarządza własną pamięcią podręczną Realpath.
- Rozmiar Ważne: Zbyt mała pamięć podręczna powoduje thrashing i spowalnia przetwarzanie żądań.
- TTL Decyduje o aktualności: długi czas życia (TTL) dla stabilnych wdrożeń, krótki w przypadku dowiązań symbolicznych/sekretów.
- Monitoring: Funkcje realpath_cache_get()/size() pokazują obciążenie i luki.
Jak dokładnie działa pamięć podręczna Realpath
Przy każdym użyciu funkcji `include`, `require` lub `file_get_contents` PHP przekształca ścieżki względne na ścieżki bezwzględne i zapisuje te wyniki w Schowek. Jeśli ta sama ścieżka pojawi się ponownie, odczytuję wynik z pamięci i oszczędzam sobie kosztownego przejścia do system plików. Mechanizm ten zauważalnie ogranicza liczbę wywołań systemowych, zwłaszcza gdy funkcja autoloadingu Composer ładuje wiele klas i plików konfiguracyjnych. Ważne: Pamięć podręczna Realpath istnieje dla każdego procesu, dlatego każdy proces roboczy PHP-FPM zaczyna czerpać korzyści dopiero po kilku żądaniach, kiedy zbuduje już własną pamięć podręczną. W ten sposób powstaje stały efekt przyspieszenia, który szczególnie się opłaca przy dużym obciążeniu.
Dlaczego pamięć podręczna ma znaczenie w dużych frameworkach
Duże frameworki i liczne wtyczki generują niezliczone na każde żądanie Dostęp do plików, które bez buforowania musiałyby za każdym razem na nowo rozpoznawać ścieżki. Jeśli pamięć podręczna Realpath jest zbyt mała, usuwa starsze wpisy, dodaje nowe, a ja obserwuję czyste Thrashing. Skutkiem tego są powtarzające się operacje statystyczne i wyszukiwania, które pochłaniają czas i obciążają operacje wejścia/wyjścia (IO). W praktyce pozwala to zmniejszyć liczbę wywołań systemowych na żądanie o około 5–15 %, co przy wysokiej częstotliwości żądań daje ogromną sumę. Im bardziej modułowa jest aplikacja, tym większy wpływ ma odpowiednio zwymiarowana pamięć podręczna Realpath.
W ten sposób ustalam odpowiedni rozmiar pamięci podręcznej
Najpierw zliczam unikalne ścieżki typowego żądania, szacuję średnią długość ścieżki i dodaję około 128 bajtów na każdy wpis Nad głową. Na podstawie liczby, długości ścieżki i obciążenia obliczam wartość realpath_cache_size, która jest wystarczająca Bufor oferuje. Wiele większych projektów zajmuje od 4 do 16 MiB, a bardzo obszerne monorepozytoria nawet więcej. Ważne jest, aby pamięć podręczna nie osiągała limitu, w przeciwnym razie tracę korzyści wynikające z jej ciągłego opróżniania. Zwiększam pojemność stopniowo, obserwuję obciążenie i dostosowuję ją odpowiednio.
Zalecane ustawienia i przykładowe wartości
Wartości domyślne pochodzą z czasów, gdy bazy kodu były niewielkie, i często nie odpowiadają już dzisiejszym Konfiguracje. W wielu aplikacjach produkcyjnych ustawiam wartość realpath_cache_size na 4096K–16384K i wydłużam czas trwania realpath_cache_ttl do 360–600 Sekundy lub więcej. Decydujące znaczenie mają wielkość projektu, częstotliwość wdrażania oraz charakter systemu plików. Poniższa tabela zawiera przydatne wartości orientacyjne, które pomogą w rozpoczęciu optymalizacji. Następnie dostosowuję te wartości na podstawie monitorowania i testów obciążeniowych.
| Ustawienie | Częste niewywiązywanie się z zobowiązań | Dobre wartości początkowe | Oczekiwany efekt |
|---|---|---|---|
| realpath_cache_size | 4096K (4 MiB) | 4096 K–16 384 K | Zmniejszony Thrashing w przypadku dużej liczby plików |
| realpath_cache_ttl | 120–600 s | 360–900 s | Dłuższe Zatrzymania pamięci podręcznej, mniej kolejnych likwidacji |
Przykłady w pliku php.ini: realpath_cache_size = 4096K oraz dla dużych frameworków realpath_cache_size = 16384K. Jeśli chodzi o trwałość, często korzystam z realpath_cache_ttl = 360 lub wyższy w przypadku rzadkich wydań. Dzięki temu ścieżki pozostają w pamięci przez wiele żądań, bez konieczności ciągłego ponownego sprawdzania ich poprawności.
Mądrze wybierać TTL – w zależności od wdrożenia
Właściwa wartość TTL zależy w dużym stopniu od procesu wdrażania oraz od zastosowania Symlinki . Kiedy przełączam wersje za pomocą rotacji dowiązań symbolicznych, pamięć podręczna nie może zwracać nieaktualnych ścieżek, dlatego ustawiam krótki czas TTL lub uruchamiam ponowne uruchomienie FPM po Rollout. W środowiskach Kubernetes, gdzie jako woluminy wykorzystuje się sekrety (Secrets) lub mapy konfiguracyjne (ConfigMaps), znacznie skracam czas TTL lub tymczasowo wyłączam pamięć podręczną Realpath. Z kolei w bardziej statycznych środowiskach hostingowych dłuższe czasy TTL są korzystniejsze, ponieważ ścieżki rzadko ulegają zmianie. W ten sposób odpowiednio do środowiska równoważę aktualność i szybkość.
Monitorowanie i weryfikacja
Regularnie sprawdzam za pomocą realpath_cache_get(), które ścieżki w Schowek znajdują się, oraz z realpath_cache_size(), ile z tego jest zajęte. Jeśli wykorzystanie zbliża się do skonfigurowanego rozmiaru, zwiększam Pojemność stopniowo. Jeśli pamięć podręczna zapełnia się wyjątkowo szybko, traktuję to jako sygnał, że potrzeba więcej pamięci lub że czas TTL jest zbyt krótki. Po zainstalowaniu większej liczby wtyczek lub aktualizacji frameworka sprawdzam to ponownie. Tylko ten, kto zna te liczby, może podejmować sensowne decyzje dotyczące optymalizacji.
Mierzalne efekty: jak mierzę wywołania systemowe i opóźnienia
Aby upewnić się, że tuning jest niezawodny, dokonuję pomiarów przed i po wprowadzeniu zmian. W systemie Linux rejestruję wywołania systemu plików na żądanie za pomocą strace lub perf, dowolnie – na pojedynczym procesie roboczym FPM lub w interfejsie CLI.
- Pojedyncze żądanie (CLI):
strace -c -o /tmp/strace.txt php public/index.phpprzedstawia przegląd tego, ilestat(),openat()orazlstat()powstać. - Dołącz pracownika FPM:
strace -fp -e trace=file -o /tmp/strace-fpm.logwyświetla tylko wywołania związane z plikami. Wcześniej za pomocąpsustalić identyfikator PID procesu roboczego. - Test obciążenia: Dzięki narzędziom takim jak
zlubcześćSymuluję obciążenie i porównuję opóźnienia P95/P99 przy różnych rozmiarach pamięci podręcznej.
Równolegle wyświetlam stan pamięci podręcznej z poziomu PHP, na przykład w punkcie końcowym debugowania lub za pomocą CLI:
<?php
$entries = realpath_cache_get();
$size = realpath_cache_size();
printf("Wpisy: %d, zużyte: %d bajtów (%.2f MiB)\n", count($entries), $size, $size/1048576);
W ten sposób rozpoznaję, czy podwyższenie realpath_cache_size rzeczywiście zmniejsza liczbę błędów i wywołań systemu plików, zamiast tylko zajmować pamięć RAM. W idealnym przypadku wskaźnik trafień wzrasta, podczas gdy opóźnienia P95 wyraźnie maleją.
W ten sposób celowo podgrzewam pamięć podręczną Realpath
Ponieważ pamięć podręczna jest tworzona dla każdego pracownika, warto Rozgrzewka po wdrożeniu lub ponownym uruchomieniu. Celem jest, aby najczęściej używane pliki include trafiły do pamięci podręcznej na wczesnym etapie, zanim pojawi się rzeczywisty ruch użytkowników.
- Powtórki żądań: Po wdrożeniu automatycznie sprawdzam kilka typowych adresów URL (interfejs użytkownika, panel administracyjny, API).
- Inicjowanie CLI: Krótki skrypt bootstrappingowy ładuje główne ścieżki (moduł autoloadingu, jądro, konfigurację, trasy).
<?php
// warmup.php
require __DIR__.'/vendor/autoload.php'; // Composer
require __DIR__.'/config/bootstrap.php'; // W zależności od projektu
require __DIR__.'/public/index.php'; // Kontroler front-endowy (może uruchomić krótki proces)
echo sprintf("Przygotowano %d wpisów, zużyto %d bajtów\n",
count(realpath_cache_get()), realpath_cache_size());
Chociaż ta procedura rozgrzewania nie uwzględnia wszystkich rzeczywistych żądań, to jednak zapisuje najczęściej używane ścieżki i wyraźnie skraca początkową fazę „zimnego startu” dla każdego pracownika.
Współpraca z OPcache i pamięcią podręczną systemu plików
OPcache przyspiesza wykonywanie plików PHP, a Realpath skraca ścieżkę dostępu do pliku, dlatego łączę te dwa rozwiązania Techniki. Jeśli chodzi o ustawienia OPcache, stosuję sprawdzone wartości i odsyłam do rzetelnych Optymalizacja OPcache, aby kod bajtowy i ścieżki idealnie ze sobą współdziałały. Ponadto Realpath korzysta z „ciepłej” pamięci podręcznej systemu operacyjnego, która szybko dostarcza wyniki wyszukiwania katalogów i metadane. W ten sposób unikam podwójnego czasu oczekiwania podczas ładowania i analizowania. Koordynując oba poziomy, można uzyskać zauważalny skrócenie czasu odpowiedzi.
Jak optymalnie wykorzystać funkcję automatycznego ładowania plików Composer
Moduł Composer-Autoloader jest głównym motorem rozpoznawania ścieżek. Im bardziej deterministycznie działa, tym łatwiejsze zadanie ma pamięć podręczna Realpath.
- Optymalizacja mapy klas:
composer dump-autoload -oogranicza skanowanie katalogów i powtarzające się wyszukiwania. - Ściśle przestrzegać zasady automatycznego ładowaniaZ
classmap-autorytatywny(Konfiguracja projektu) unikam niepotrzebnych rozwiązań awaryjnych, które w przeciwnym razie powodowałyby dodatkowe rozpoznawanie ścieżek. - Uporządkuj strukturę: Płaskie, spójne hierarchie folderów oraz niewielka liczba przypadków szczególnych (np. pliki include obejmujące wiele modułów lub klientów) stabilizują obciążenie pamięci podręcznej.
Wynik: mniej różnych ścieżek na żądanie, większa ponowna wykorzystalność w pamięci podręcznej Realpath, a tym samym mniejsze obciążenie operacji wejścia/wyjścia.
FPM i budżet pamięci: jakie wartości są realistyczne dla poszczególnych procesów
Ponieważ pamięć podręczna Realpath istnieje dla każdego procesu, skonfigurowany rozmiar mnoży się przez liczbę procesów roboczych FPM. Dlatego planuję następujący budżet:
- Przykład: 12 procesów roboczych × 8 MiB = 96 MiB nagłówka Realpath; do tego dochodzą OPcache, sterta PHP oraz obciążenie związane z rozszerzeniami.
- Wyważanie: Jeśli OPcache ma wystarczająco dużo miejsca, Realpath może otrzymać kilka MiB więcej – lub odwrotnie.
- Specyficzne dla basenu: Poszczególne pule FPM (Front, Admin, API) mogą mieć różne rozmiary ścieżek rzeczywistych, w zależności od zajmowanej przez nie przestrzeni kodu.
Jeśli kod rośnie wraz z każdą wersją, rośnie również realpath_cache_size-zazwyczaj uwzględnia się zapotrzebowanie. Dlatego regularnie sprawdzam szczytowe obciążenie, nie tylko w stanie spoczynku.
Przypadki szczególne: dowiązania symboliczne, kontenery i NFS
W przypadku wdrażania dowiązań symbolicznych zamieszczam krótką TTL lub uruchom ponownie FPM po wdrożeniu, aby wszystkie procesy robocze załadowały aktualne ścieżki. W kontenerach ze zmiennymi woluminami zwracam uwagę, aby pamięć podręczna nie zawierała nieaktualnych Cele regulując wartość TTL. W przypadku NFS zaleca się dodatkowo zastosowanie odpowiedniej strategii OPcache oraz ograniczenie do minimum zmian katalogów. Jeśli ścieżki ulegają zmianie w trakcie działania systemu, w razie wątpliwości celowo czyszczę pamięć za pomocą clearstatcache(true) w tym część dotyczącą ścieżki rzeczywistej. Jasne zasady wdrażania zapobiegają niespójnościom między różnymi węzłami roboczymi.
Typowe przeszkody i ograniczenia
Ponieważ pamięć podręczna istnieje dla każdego procesu, każdy musi Pracownik Najpierw należy zebrać ścieżki, zanim efekt zacznie działać. W konfiguracjach z surowymi ograniczeniami open_basedir pamięć podręczna Realpath działa w ograniczonym zakresie, dlatego biorę to pod uwagę Granice podczas planowania. Zbyt małe pamięci podręczne powodują thrashing, zbyt duże marnują pamięć RAM – na podstawie pomiarów szukam punktu szczytowego krzywej. Ponadto zwracam uwagę, że Realpath nie jest pamięcią podręczną metadanych ani treści, lecz przechowuje wyłącznie wyniki rozpoznawania ścieżek. Osoby mające błędne oczekiwania przeoczają przyczyny leżące gdzie indziej.
Bezpieczeństwo eksploatacji: typowe usterki i szybkie kontrole
Niektóre objawy wyraźnie wskazują na problemy z Realpath – i można je szybko zweryfikować:
- Wahania opóźnień po wdrożeniu: Albo zbyt długi czas TTL podczas rotacji dowiązań symbolicznych, albo brak fazy rozgrzewania. Rozwiązanie: krótki czas TTL, ponowne uruchomienie FPM, a następnie przeprowadzenie fazy rozgrzewania.
- Wiele powtórzeń
stat()-wyświetleniaZstracewidoczne; często rozmiar pamięci podręcznej jest zbyt mały lub niektóre ścieżki dynamiczne wypierają „hot entries”. - Duża zmienność między pracownikami: Różne pamięci podręczne dla poszczególnych procesów. Rozwiązanie: spójne rozgrzewanie systemu i równomierny rozkład żądań.
Często wystarczy szybka kontrola stanu za pomocą PHP:
<?php
$entries = realpath_cache_get();
$byDir = 0; $byFile = 0;
foreach ($entries as $e) { $e['is_dir'] ? $byDir++ : $byFile++; }
printf("Katalogi: %d, Pliki: %d, Zużyte: %.2f MiB\n", $byDir, $byFile, realpath_cache_size()/1048576);
W ten sposób widzę, czy w pamięci podręcznej dominują przede wszystkim katalogi (wiele modułów, struktury dostawców), czy też pliki (liczne pliki konfiguracyjne/klasy) – i dostosowuję strukturę lub rozmiar.
Pamięć podręczna stat vs. pamięć podręczna realpath: świadome rozróżnienie
Oprócz pamięci podręcznej Realpath PHP prowadzi również Pamięć podręczna statystyk dla wyników z stat() oraz powiązanych wywołań. Obie pamięci podręczne można clearstatcache() wpływać na:
clearstatcache()czyści pamięć podręczną statystyk (opcjonalnie dla konkretnego pliku).clearstatcache(true)dodatkowo opróżnia pamięć podręczną Realpath.
W rzadkich przypadkach – na przykład w przypadku długotrwale działających procesów CLI z dynamicznymi montowaniami lub podczas wymiany na gorąco – stosuję ukierunkowane clearstatcache(true)-Hook po wykryciu zmian. W przeciwnym razie pozwalam działać TTL i unikam niepotrzebnego unieważniania.
Praktyczny przegląd środowisk hostingowych
Najpierw ustalam wielkość projektu, czyli ile plików ładuje typowe żądanie, a następnie sprawdzam obciążenie Skrytki. Następnie wybieram wartość realpath_cache_size, która pomieści wszystkie często używane ścieżki wraz z rezerwą, i ustawiam czas TTL dostosowany do częstotliwości wdrażania. Potem obserwuję efekty za pomocą narzędzi monitorujących i logów oraz ostrożnie dostosowuję wartości, zamiast je radykalnie zwiększać. Ponadto warto przyjrzeć się pamięci podręcznej systemu operacyjnego, na przykład ustawieniu w systemie Linux Ciśnienie w pamięci podręcznej VFS, ponieważ Realpath korzysta z szybkiego wyszukiwania katalogów. W ten sposób wprowadzam ulepszenia, nie przeoczając przy tym skutków ubocznych.
Zakres i ścieżki konfiguracji: gdzie ustawiam daną wartość
W zależności od środowiska wprowadzam te parametry w różnych miejscach:
- Globalny:
php.inidla ustawień domyślnych obowiązujących w całym systemie. - Pro-Pool: W pulach FPM według
php_admin_value[realpath_cache_size]orazphp_admin_value[realpath_cache_ttl]dostosować rozmiary odpowiednio do frontendu i API. - Katalog Pro: W
.user.ini(o ile jest to dozwolone), co ma sens w środowiskach hostingu współdzielonego.
Ważne: Zmiany w php.ini Konfiguracje FPM-Pool wymagają ponownego uruchomienia lub przeładowania, aby procesy robocze uruchomiły się z nowymi wartościami.
CLI, Queue-Worker i zadania cron: te same zasady, inne czasy wykonania
Skrypty CLI i procesy kolejkowe również korzystają z pamięci podręcznej Realpath – jednak Żywotność często inaczej:
- Krótkotrwałe zadania CLI: Pamięć podręczna jest tworzona od nowa przy każdym wywołaniu. W tym przypadku rozruch i długi czas TTL nie mają większego znaczenia; ważniejsza jest raczej odpowiednia wielkość, aby powtarzające się wstawki były buforowane w samym zadaniu.
- Demony/pracownicy: Procesy długotrwałe (Supervisor, Systemd) tworzą stabilną pamięć podręczną. Po Odświeżanie kodu (Deploy) proces powinien uruchomić się od nowa, w przeciwnym razie w pamięci podręcznej mogą pozostać nieaktualne ścieżki.
Ocena wielkości projektów i efekt magazynowania
Aplikacja zawierająca 4000 unikalnych ścieżek o długości 80 bajtów każda oraz 128 bajtów nadmiarowych danych na każdy wpis zajmuje w przybliżeniu 832 KB Pamięć w pamięci podręcznej Realpath; z zapasem planuję 4 MiB lub więcej. Jeśli baza kodu znacznie się powiększy z powodu wtyczek lub modułów, skaluję ją liniowo i ponownie sprawdzam Hity a nie pomyłki. Na serwerach współdzielonych zwracam dodatkowo uwagę na limity i-węzłów, ponieważ zbyt duża liczba małych plików obciąża cały system; w tym pomaga mi ten przegląd Limity i-węzłów. Lepiej liczyć się z rezerwą, niż ciągle działać na granicy możliwości. W ten sposób oszczędzam wywołania systemowe bez niepotrzebnego zużycia pamięci RAM.
Krótko i zwięźle: mój plan tuningowy
Najpierw mierzę liczbę plików na żądanie, a następnie ustawiam odpowiednią Rozmiar pamięci podręcznej oraz dostosowaną do praktyki wdrażania TTL. Następnie sprawdzam obciążenie za pomocą funkcji realpath_cache_get()/size(), stopniowo dostosowuję ustawienia i łączę to wszystko z precyzyjnym dostrojeniem OPcache i pamięci podręcznej systemu operacyjnego. Podczas wdrażania dowiązań symbolicznych utrzymuję krótki czas TTL lub restartuję FPM, natomiast w środowiskach statycznych stosuję długie czasy życia. Celem pozostaje wysoki wskaźnik trafień w pamięci podręcznej bez marnowania pamięci RAM. W ten sposób czerpię z pamięci podręcznej Realpath niedoceniany zastrzyk mocy, zapewniający stałą wydajność PHP.


