Close-up of a modern server room with blinking indicator lights and cables, system administrator managing servers on a laptop.

Dostrajanie PHP-FPM: Konfiguracja Menedżera Procesów dla Optymalizacji TTFB

Zrozumienie PHP-FPM i jego roli w skracaniu czasu do pierwszego bajtu (TTFB)

PHP-FPM (PHP FastCGI Process Manager) jest kluczowym elementem w stosie wydajności nowoczesnych aplikacji PHP. Działa jako menedżer procesów, który efektywnie obsługuje wykonywanie skryptów PHP, zarządzając pulami procesów roboczych reagujących na przychodzące żądania sieciowe. W przeciwieństwie do tradycyjnego CGI, PHP-FPM został zaprojektowany do utrzymywania trwałych procesów PHP, co znacznie zmniejsza narzut związany z uruchamianiem nowych procesów dla każdego żądania. To trwałe zarządzanie procesami prowadzi do szybszego wykonywania kodu PHP i poprawy reaktywności aplikacji internetowych.

Koncepcja Time to First Byte (TTFB) oznacza czas pomiędzy wysłaniem przez klienta żądania HTTP a otrzymaniem pierwszego bajtu odpowiedzi z serwera. TTFB jest kluczową metryką do mierzenia wydajności stron internetowych, ponieważ bezpośrednio wpływa na doświadczenie użytkownika oraz pozycjonowanie w wyszukiwarkach. Niższy TTFB oznacza szybsze ładowanie początkowej części strony, co zwiększa odczuwalną szybkość i responsywność. Dla SEO optymalizacja TTFB jest niezbędna, ponieważ wyszukiwarki preferują strony dostarczające treści szybko.

Zdolność PHP-FPM do zarządzania procesami roboczymi PHP odgrywa kluczową rolę w optymalizacji TTFB. Gdy serwer WWW otrzymuje żądanie PHP, PHP-FPM przydziela proces roboczy do obsługi wykonania skryptu. Jeśli PHP-FPM nie jest odpowiednio skonfigurowany, liczba procesów roboczych może być niewystarczająca, co prowadzi do kolejkowania żądań i zwiększenia opóźnień. Z kolei zbyt wiele bezczynnych procesów zużywa niepotrzebnie zasoby systemowe. Dlatego zarządzanie procesami bezpośrednio wpływa na szybkość rozpoczęcia wykonywania skryptów PHP, oddziałując na TTFB.

Zdjęcie serwerowni z wysokowydajnym rackiem serwerów, podświetlonymi diodami wskazującymi status, symbolizujące zarządzanie procesami PHP-FPM i optymalizację zasobów.

Istnieją trzy podstawowe tryby menedżera procesów PHP-FPM — static, dynamic i ondemand — każdy o innym zachowaniu i wpływie na wydajność:

Obraz przedstawia trzy procesy serwerowe: statyczne, dynamiczne skalowanie i uruchamianie na żądanie w nowoczesnym centrum danych.
  • Tryb static prealokuje stałą liczbę procesów roboczych. To podejście gwarantuje stałą liczbę gotowych procesów, co może minimalizować TTFB przy przewidywalnym obciążeniu, ale może marnować zasoby podczas niskiego ruchu.

  • Tryb dynamic dostosowuje liczbę procesów roboczych w ramach skonfigurowanych minimalnych i maksymalnych limitów. Zaczyna od bazowej liczby procesów i skaluje ich liczbę w górę lub w dół w zależności od zapotrzebowania, równoważąc wykorzystanie zasobów i responsywność.

  • Tryb ondemand tworzy procesy robocze tylko wtedy, gdy pojawiają się żądania, i kończy je po okresie bezczynności. Ten tryb oszczędza zasoby podczas przerw w ruchu, ale może nieznacznie zwiększać TTFB, gdy procesy muszą się uruchomić.

Wybór odpowiedniego trybu menedżera procesów oraz przemyślana konfiguracja jego parametrów są niezbędne do optymalizacji TTFB dla różnych obciążeń serwera i wzorców ruchu. Efektywne zarządzanie procesami zapewnia, że PHP-FPM może szybko reagować na żądania, minimalizując opóźnienia i poprawiając ogólną wydajność.

Kluczowe parametry konfiguracyjne menedżera procesów PHP-FPM dla optymalizacji TTFB

Szczegółowe wyjaśnienie trybów pm (menedżer procesów): Static, Dynamic, Ondemand

Parametr pm określa, jak PHP-FPM zarządza swoimi procesami roboczymi, co bezpośrednio wpływa na responsywność serwera i TTFB. Wybór odpowiedniego trybu zależy od wzorców ruchu, zasobów serwera oraz celów wydajnościowych.

  • Tryb static: Liczba procesów potomnych jest stała i niezmienna, określona przez pm.max_children. To ustawienie zapewnia, że PHP-FPM zawsze ma taką samą liczbę dostępnych pracowników do obsługi żądań, co może być korzystne przy dużym, przewidywalnym ruchu. Jednak może prowadzić do marnowania zasobów CPU i pamięci podczas okresów niskiego ruchu, gdy nieużywane procesy pozostają bezczynne.

  • Tryb dynamic: Zapewnia elastyczność, pozwalając PHP-FPM skalować liczbę procesów roboczych pomiędzy pm.min_spare_servers a pm.max_spare_servers, przy czym pm.start_servers definiuje początkową wielkość puli. Ten tryb równoważy wykorzystanie zasobów i responsywność, dostosowując liczbę pracowników do natężenia przychodzących żądań, co pomaga utrzymać niskie TTFB przy zmiennym obciążeniu.

  • Tryb ondemand: Zaczyna bez procesów roboczych i tworzy je tylko wtedy, gdy pojawiają się żądania. Procesy są kończone po okresie bezczynności określonym przez pm.process_idle_timeout, co oszczędza zasoby systemowe podczas przerw w ruchu. Choć efektywny pod względem zasobów, tryb ten może wprowadzać niewielkie opóźnienie w obsłudze żądań podczas uruchamiania procesów, potencjalnie zwiększając TTFB, jeśli nie jest odpowiednio dostrojony.

Wybór właściwego trybu wymaga rozważenia kompromisów między zużyciem zasobów a czasem odpowiedzi, szczególnie przy optymalizacji TTFB.

Strojenie pm.max_children w celu zrównoważenia współbieżności i limitów zasobów

Dyrektywa pm.max_children ogranicza maksymalną liczbę jednoczesnych procesów roboczych PHP-FPM. Parametr ten jest kluczowy dla kontrolowania współbieżności i zapewnienia, że serwer nie wyczerpie dostępnej pamięci ani mocy CPU.

  • Ustawienie zbyt niskiej wartości pm.max_children prowadzi do kolejkowania żądań, zwiększając czas oczekiwania i podnosząc TTFB, gdy klienci czekają na dostępnych pracowników.
  • Ustawienie zbyt wysokiej wartości grozi przeciążeniem serwera, powodując wymianę pamięci na dysk (swapping) lub walkę o CPU, co pogarsza ogólną wydajność i czas odpowiedzi.

Idealna wartość zależy od specyfikacji serwera oraz średniego zużycia pamięci przez każdy proces PHP. Powszechnie stosowanym podejściem jest obliczenie:

pm.max_children = Całkowita dostępna pamięć * Procent przeznaczony na PHP / Średnia pamięć na proces PHP

Ta formuła pomaga zmaksymalizować współbieżność bez ryzyka wyczerpania zasobów.

Konfiguracja pm.start_servers, pm.min_spare_servers i pm.max_spare_servers dla trybu dynamicznego

W trybie dynamicznym te parametry precyzyjnie regulują, jak PHP-FPM skaluje procesy robocze:

  • pm.start_servers: Liczba procesów roboczych tworzonych podczas uruchamiania. Ustawienie tej wartości blisko średniej oczekiwanej liczby jednoczesnych żądań zapewnia natychmiastową dostępność pracowników, zmniejszając opóźnienie początkowe żądań i TTFB.

  • pm.min_spare_servers: Minimalna liczba bezczynnych pracowników, które należy utrzymywać. Utrzymanie zdrowej liczby zapasowych pracowników zapobiega opóźnieniom spowodowanym tworzeniem nowych procesów podczas nagłych skoków ruchu.

  • pm.max_spare_servers: Maksymalna liczba bezczynnych pracowników dozwolona. Ustawienie zbyt wysokiej wartości marnuje zasoby, natomiast zbyt niska grozi niewystarczającą liczbą pracowników podczas szczytowego obciążenia.

Zrównoważenie tych parametrów zapewnia, że PHP-FPM może szybko zwiększać lub zmniejszać liczbę procesów w zależności od zapotrzebowania, utrzymując responsywność bez niepotrzebnego zużycia zasobów.

Ustawienie pm.process_idle_timeout w trybie ondemand w celu zmniejszenia liczby bezczynnych pracowników i marnotrawstwa zasobów

W trybie ondemand pm.process_idle_timeout definiuje, jak długo bezczynny pracownik pozostaje aktywny przed zakończeniem. Optymalizacja tego limitu jest kluczowa:

  • Zbyt krótki timeout powoduje częste kończenie i ponowne uruchamianie pracowników, co może zwiększać TTFB z powodu opóźnień przy uruchamianiu procesów.
  • Zbyt długi timeout prowadzi do marnowania zasobów przez utrzymywanie niepotrzebnie żywych bezczynnych procesów.

Typowym punktem wyjścia jest 10 do 20 sekund, dostosowywane w zależności od wzorców ruchu. Precyzyjne dostrojenie tego parametru pomaga zrównoważyć oszczędność zasobów z utrzymaniem niskich opóźnień odpowiedzi.

Wpływ tych parametrów na zdolność PHP-FPM do szybkiego obsługiwania jednoczesnych żądań, redukując TTFB

Prawidłowa konfiguracja parametrów menedżera procesów PHP-FPM zapewnia dostępność wystarczającej liczby pracowników do szybkiego przetwarzania przychodzących żądań PHP. Ta dostępność zmniejsza opóźnienia kolejkowania i skraca czas, po którym serwer zaczyna wysyłać odpowiedź, co bezpośrednio poprawia TTFB. Natomiast źle dostrojone ustawienia mogą powodować wąskie gardła, gdzie żądania czekają na wolnych pracowników, co zwiększa opóźnienia i pogarsza doświadczenie użytkownika.

Przykłady typowych konfiguracji dla różnych obciążeń serwera

  • Serwer o niskim ruchu (np. mały blog lub strona osobista):
pm = ondemand
pm.max_children = 5
pm.process_idle_timeout = 15s

Ta konfiguracja oszczędza zasoby, tworząc pracowników tylko wtedy, gdy jest to potrzebne, co sprawdza się przy sporadycznym ruchu.

  • Serwer o średnim ruchu (np. mała strona firmowa):
pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10

Równoważy wykorzystanie zasobów i responsywność, dostosowując się do umiarkowanych wahań ruchu.

  • Serwer o dużym ruchu (np. popularny sklep internetowy lub serwis informacyjny):
pm = static
pm.max_children = 50

Zapewnia stałą pulę pracowników gotowych do obsługi wysokiej liczby jednoczesnych żądań, minimalizując opóźnienia i poprawiając TTFB przy dużym obciążeniu.

Dopasowanie tych parametrów na podstawie rzeczywistego ruchu i dostępności zasobów jest kluczowe dla utrzymania optymalnej wydajności i stałego minimalizowania TTFB.

Monitorowanie i benchmarkowanie wydajności PHP-FPM w celu kierowania decyzjami dotyczącymi strojenia

Narzędzia i metody pomiaru TTFB oraz wydajności PHP-FPM

Dokładny pomiar Time to First Byte (TTFB) oraz ogólnej wydajności PHP-FPM jest kluczowy dla skutecznego strojenia. Różne narzędzia umożliwiają programistom i administratorom systemów benchmarkowanie i monitorowanie tych metryk w czasie rzeczywistym lub przez dłuższy okres:

  • ApacheBench (ab): Proste, ale potężne narzędzie wiersza poleceń do symulowania żądań HTTP i pomiaru czasów odpowiedzi, w tym TTFB. Pomaga określić, ile żądań PHP-FPM może obsłużyć jednocześnie i jak szybko odpowiada.

  • Siege: Podobne do ApacheBench, ale z dodatkowymi możliwościami, Siege pozwala na wielowątkowe testy obciążeniowe i obsługuje konfigurację do długotrwałego testowania wytrzymałości, dostarczając informacji o stabilności PHP-FPM pod obciążeniem.

  • New Relic i Datadog: Te usługi monitorowania wydajności aplikacji (APM) oferują dogłębną widoczność procesów PHP-FPM, w tym czasów trwania żądań, wolnych transakcji i zużycia zasobów. Pomagają zidentyfikować wąskie gardła wpływające na TTFB w środowiskach produkcyjnych.

  • Narzędzia deweloperskie przeglądarki: Nowoczesne przeglądarki pokazują TTFB w panelach sieciowych, co jest przydatne do szybkich kontroli podczas tworzenia lub rozwiązywania problemów.

Regularne korzystanie z tych narzędzi może ujawnić trendy i anomalie w wydajności PHP-FPM, umożliwiając podejmowanie decyzji strojenia opartych na danych.

Jak interpretować metryki na stronie statusu PHP-FPM (pm.status_path)

Włączenie strony statusu PHP-FPM poprzez konfigurację pm.status_path dostarcza metryk w czasie rzeczywistym dotyczących puli workerów i obsługi żądań:

  • active processes: Liczba workerów aktualnie przetwarzających żądania. Utrzymująca się wysoka liczba bliska pm.max_children może wskazywać na nasycenie.

  • idle processes: Workerzy oczekujący na nowe żądania. Niska liczba idle w godzinach szczytu może sygnalizować niewystarczającą liczbę wolnych workerów, co przyczynia się do podwyższonego TTFB.

  • listen queue: Żądania oczekujące na obsłużenie. Długość kolejki różna od zera oznacza opóźnienia w obsłudze, co bezpośrednio zwiększa TTFB.

  • max listen queue: Najdłuższa zarejestrowana długość kolejki od uruchomienia, pomocna w wykrywaniu okresowych wąskich gardeł.

Monitorowanie tych metryk pozwala administratorom proaktywnie dostosowywać parametry menedżera procesów, zapewniając odpowiednią współbieżność i szybkość reakcji.

Wykorzystanie logów i śledzenia wolnych żądań do identyfikacji wąskich gardeł

PHP-FPM obsługuje śledzenie wolnych żądań za pomocą dyrektywy request_slowlog_timeout. Gdy żądanie przekroczy ten limit czasu, jego backtrace jest zapisywany w logu, wskazując problematyczne skrypty lub zapytania do bazy danych powodujące opóźnienia. W połączeniu z logami błędów i logami dostępu, śledzenie wolnych żądań pomaga wyizolować problemy powodujące wzrost TTFB.

Ponadto analiza logów może ujawnić wzorce takie jak:

  • Często uruchamiane długotrwałe skrypty wyczerpujące workerów
  • Błędy PHP powodujące awarie i restarty procesów
  • Nagłe skoki liczby żądań prowadzące do nasycenia workerów

Te informacje są nieocenione dla celowanego strojenia i optymalizacji kodu.

Studium przypadku z życia: poprawa TTFB przed i po strojenie menedżera procesów PHP-FPM

Porównanie panelu serwerowego e-commerce przed i po optymalizacji, pokazujące poprawę wydajności i spokojnych operatorów w nowoczesnym centrum IT.

Weźmy pod uwagę średnio obciążoną stronę e-commerce, która doświadcza sporadycznych skoków ruchu, skutkujących wysokim TTFB średnio wynoszącym 600 ms w godzinach szczytu. Początkowa konfiguracja PHP-FPM używała domyślnych ustawień pm = dynamic z pm.max_children = 10, pm.start_servers = 2 oraz zbyt niskimi wartościami serwerów zapasowych dla zmiennego obciążenia.

Po włączeniu strony statusu PHP-FPM i analizie metryk administrator zaobserwował:

  • Stałe nasycenie aktywnych procesów osiągające limit pm.max_children
  • Kolejki oczekiwania różne od zera wskazujące na opóźnienia w obsłudze żądań
  • Częste wpisy w logach wolnych zapytań pochodzące ze skryptów intensywnie korzystających z bazy danych

Podjęte kroki strojenia obejmowały:

  1. Zwiększenie pm.max_children do 30 w celu poprawy współbieżności.
  2. Dostosowanie pm.start_servers do 10 oraz serwerów zapasowych do pm.min_spare_servers = 5 i pm.max_spare_servers = 15 dla lepszego skalowania.
  3. Optymalizację wolnych skryptów zidentyfikowanych za pomocą logów wolnych zapytań.
  4. Ciągłe monitorowanie za pomocą Datadog w celu oceny efektów.

Po strojenie średni TTFB strony spadł do poniżej 200 ms w godzinach szczytu, co znacząco poprawiło doświadczenie użytkowników i wspiera cele SEO. Wykorzystanie zasobów serwera pozostało stabilne, co świadczy o skutecznym wyważeniu między wydajnością a stabilnością.

Ten przykład podkreśla wartość monitorowania i benchmarkingu jako podstawy skutecznego strojenia PHP-FPM ukierunkowanego na minimalizację TTFB.

Zaawansowane techniki strojenia PHP-FPM wykraczające poza podstawowe ustawienia menedżera procesów

Dostosowanie request_terminate_timeout i request_slowlog_timeout w celu zarządzania długotrwałymi skryptami wpływającymi na TTFB

Długotrwałe skrypty PHP mogą poważnie wpływać na Time to First Byte, zajmując procesy robocze przez dłuższy czas i uniemożliwiając im szybkie obsłużenie innych nadchodzących żądań. Dyrektywy request_terminate_timeout i request_slowlog_timeout są potężnymi narzędziami do złagodzenia tego problemu.

  • request_terminate_timeout ustawia maksymalny czas wykonania dla każdego żądania PHP obsługiwanego przez procesy PHP-FPM. Jeśli skrypt przekroczy ten limit, PHP-FPM wymusza jego zakończenie. Zapobiega to sytuacjom, w których niekontrolowane lub nieefektywne skrypty nieograniczenie zużywają zasoby, co w przeciwnym razie powodowałoby kolejki żądań i zwiększone TTFB.

  • request_slowlog_timeout umożliwia logowanie skryptów przekraczających określony czas wykonania, dostarczając wgląd w wąskie gardła wydajności. Analizując logi wolnych zapytań, deweloperzy mogą zidentyfikować i zoptymalizować problematyczne fragmenty kodu opóźniające czas odpowiedzi.

Konfiguracja tych limitów pozwala wyważyć dopuszczalność długotrwałych procesów z zapobieganiem degradacji ogólnej responsywności. Na przykład:

request_terminate_timeout = 30s
request_slowlog_timeout = 10s

Ta konfiguracja kończy skrypty działające dłużej niż 30 sekund i loguje te przekraczające 10 sekund, ułatwiając proaktywne strojenie wydajności.

Użycie rlimit_files i rlimit_core do optymalizacji limitów zasobów dla procesów PHP-FPM

Procesy PHP-FPM podlegają systemowym limitom zasobów, które mogą wpływać na ich stabilność i wydajność. Dyrektywy rlimit_files i rlimit_core konfigurują te limity na poziomie puli PHP-FPM:

  • rlimit_files ustawia maksymalną liczbę deskryptorów plików, które proces może otworzyć jednocześnie. Zwiększenie tej wartości jest kluczowe dla aplikacji intensywnie korzystających z plików lub sieci, zapewniając, że PHP-FPM może obsługiwać wiele jednoczesnych dostępów do zasobów bez osiągania systemowych limitów, które powodują zatrzymanie procesów i zwiększenie TTFB.

  • rlimit_core definiuje maksymalny rozmiar zrzutów pamięci (core dumps) generowanych w przypadku awarii procesów. Choć nie wpływa bezpośrednio na wydajność, odpowiednia konfiguracja pomaga w debugowaniu problemów, które mogą pośrednio wpływać na responsywność PHP-FPM.

Prawidłowe dostrojenie tych limitów zapewnia stabilną pracę procesów PHP-FPM pod obciążeniem, minimalizując nieoczekiwane awarie i opóźnienia.

Wykorzystanie buforowania kodu operacyjnego (np. OPcache) w połączeniu z dostrajaniem PHP-FPM dla szybszego wykonywania PHP

Buforowanie kodu operacyjnego jest niezbędnym uzupełnieniem dostrajania PHP-FPM. OPcache przechowuje wstępnie skompilowany bajtkod PHP w pamięci współdzielonej, co znacznie skraca czas parsowania i kompilacji skryptów przy każdym żądaniu.

W połączeniu z dobrze dostrojonym zarządzaniem procesami PHP-FPM, OPcache może znacząco skrócić czas wykonywania skryptów i zmniejszyć TTFB. Do najlepszych praktyk należą:

  • Włączenie OPcache z odpowiednią alokacją pamięci (opcache.memory_consumption), aby zapobiec usuwaniu danych z pamięci podręcznej.
  • Ustawienie opcache.validate_timestamps w celu kontrolowania, jak często OPcache sprawdza zmiany w skryptach, co pozwala zrównoważyć wydajność i elastyczność podczas rozwoju.
  • Monitorowanie wskaźników trafień OPcache i rekonfiguracja w przypadku wzrostu liczby nieudanych trafień w pamięć podręczną.

Razem, dostrajanie PHP-FPM i buforowanie kodu operacyjnego tworzą solidną podstawę dla efektywnej obsługi aplikacji PHP.

Rozważania dotyczące dostrajania PHP-FPM na serwerach wielordzeniowych lub z dużą ilością pamięci w celu maksymalizacji przepustowości i minimalizacji opóźnień

Nowoczesne serwery często posiadają wiele rdzeni CPU oraz dużą ilość pamięci, co stwarza możliwości dostrajania PHP-FPM w celu maksymalizacji przepustowości i redukcji TTFB:

  • Skalowanie pm.max_children: Na systemach wielordzeniowych zwiększenie liczby procesów roboczych PHP-FPM pozwala na równoległą obsługę żądań, jednak musi być to zrównoważone z ograniczeniami pamięci, aby uniknąć wymiany na dysk.

  • Afinitet i przypinanie do CPU: Konfiguracja afinitetu procesów roboczych do rdzeni CPU może zmniejszyć przełączanie kontekstu i błędy w pamięci podręcznej, poprawiając opóźnienia i przepustowość.

  • Optymalizacja pamięci: Serwery z dużą ilością pamięci pozwalają na wyższe wartości pm.max_children oraz większe pule OPcache, co zwiększa współbieżność i szybkość wykonywania.

  • Unikanie nadmiernego przydzielania zasobów: Nadmiar procesów roboczych może powodować konflikty o zasoby, dlatego dostrajanie powinno być oparte na monitoringu i testach wydajności w celu znalezienia optymalnego poziomu współbieżności.

Dopasowanie ustawień PHP-FPM do możliwości sprzętowych zapewnia efektywne wykorzystanie zasobów i utrzymanie niskiego TTFB.

Konfigurowanie zmiennych środowiskowych i dyrektyw PHP wpływających na zachowanie i wydajność procesów roboczych PHP-FPM

Poza podstawowymi parametrami menedżera procesów, zmienne środowiskowe i dyrektywy PHP wpływają na wydajność procesów roboczych PHP-FPM:

  • Ustawianie zmiennych env w konfiguracji puli pozwala przekazać niezbędne informacje środowiskowe do skryptów PHP bez dodatkowego narzutu, takie jak dane uwierzytelniające do bazy danych czy klucze API.

  • Dyrektywy PHP, takie jak memory_limit, max_execution_time i max_input_vars, kontrolują zachowanie skryptów oraz zużycie zasobów. Odpowiednia kalibracja tych parametrów zapobiega niekontrolowanym skryptom, które obniżają responsywność i zwiększają TTFB.

  • Włączenie optymalizacji pamięci podręcznej realpath (realpath_cache_size, realpath_cache_ttl) zmniejsza liczbę odwołań do systemu plików, przyspieszając wykonywanie skryptów.

  • Konfiguracja poziomów logowania (error_log, log_level) pomaga identyfikować problemy z wydajnością bez przeciążania pamięci masowej lub procesora nadmierną ilością logów.

Dostrajanie tych ustawień w harmonii z zarządzaniem procesami PHP-FPM może prowadzić do stabilniejszego środowiska i szybszych czasów odpowiedzi.


Te zaawansowane techniki dostrajania wykraczają poza podstawową konfigurację menedżera procesów, aby zająć się głębszymi aspektami działania PHP-FPM. Zarządzając długotrwałymi skryptami, optymalizując limity zasobów systemowych, wykorzystując cache opcode, dopasowując ustawienia do sprzętu oraz precyzując zmienne środowiskowe PHP, administratorzy mogą osiągnąć trwałe poprawy w TTFB oraz ogólnej wydajności aplikacji PHP.

Leave a Comment