5 Sposobów na zwiększenie wydajności PHP-Tideways

5 sposoby na zwiększenie wydajności PHP

BONUS: omówiliśmy ten temat z ekspertem w społeczności PHP w naszym podcaście:

z przysłowiowego, pudełka, PHP zapewnia przyzwoitą wydajność. Jest jednak kilka rzeczy, które my, jako programiści PHP i administratorzy systemów, możemy zrobić, aby jeszcze bardziej zwiększyć jego wydajność; czasami prawie bez wysiłku.

w tym poście przejdę przez pięć z tych sposobów. Zanim skończysz czytać, powinieneś zobaczyć co najmniej znaczący wzrost wydajności aplikacji PHP. Zaczynajmy.

użyj PHP 7

jednym z najlepszych sposobów na poprawę wydajności PHP jest uruchomienie najnowszej wersji (PHP 7). Oferuje znaczną poprawę prędkości w stosunku do każdej poprzedniej wersji. Teraz wyniki zawsze będą się różnić, ponieważ nie ma dwóch takich samych aplikacji. Jednak na podstawie raportów różnych programistów i znaczących firm hostingowych poprawa wydajności jest znacząca.

oto mała próbka:

  • oficjalne benchmarki PHP informują, że PHP 7 może wykonać dwa razy więcej żądań na sekundę w porównaniu do PHP 5.6.
  • benchmarki wydajności PHP Kinsta pokazują, że WordPress 5.0 może wykonać 3x więcej transakcji niż PHP 5.6; i
  • Pantheon poinformował, że PHP 7 dało 64% poprawę w stosunku do wersji 5.3.

jeśli to Ci nie wystarczy, Sprawdź swoje benchmarki i zobacz, co mówią.

dodatkowo PHP 7.0.0 został wydany 3 grudnia 2015 roku, a najnowsza stabilna wersja, 7.3.6, została wydana 30 maja tego roku.

co więcej, ostateczna wersja PHP 5, 5.6, poszła EOL (koniec życia) 7 miesięcy temu, na Dec 31, 2018. Tak więc, jeśli jeszcze tego nie zrobiłeś, nadszedł już czas przejścia na PHP 7. Dokonaj aktualizacji i, jak powiedział Rasmus na phpCE 2018, Przejdź na Zielono (er), zmniejszając koszty hostingu.

Odinstaluj Xdebug

następną rzeczą do sprawdzenia jest to, że Xdebug nie jest zainstalowany na serwerach produkcyjnych. Oczywiście, Xdebug jest jednym z najbardziej wyrafinowanych i wszechstronnych profilerów i debuggerów dla PHP, ale nigdy nie powinien być włączony (nawet zainstalowany) na serwerze produkcyjnym, przynajmniej do czasu wydania Xdebug 3 i powinieneś dołączyć do nas we wspieraniu Dericka w pracy nad nim.

chociaż wskaźniki wydajności są różne (zawsze tak robią), jeden raport na temat przepełnienia stosu wykazał wzrost wydajności o 50% poprzez całkowite usunięcie Xdebug. Co więcej, ważne jest, aby pamiętać, że chociaż Xdebug był zainstalowany na serwerze-nie był nawet włączony!

Xdebug performance benchmarkXdebug performance benchmark

aby sprawdzić, czy jest zainstalowany, uruchom php -m | grep -i xdebug lub sprawdź panel administracyjny dostawcy usług hostingowych. A jeśli chcesz dowiedzieć się więcej o tym, jak działa Xdebug, sprawdź dokumentację Xdebug.

Use Composer Optimize Autoloader

chociaż wszyscy jesteśmy prawdopodobnie bardzo zaznajomieni z używaniem Composera do zarządzania pakietami, jeśli nie rozważymy optymalizacji generowanej konfiguracji, nasze aplikacje nie będą działać tak dobrze, jak to możliwe.

oto cytat z dokumentacji kompozytora, który wyjaśnia dlaczego:

ze względu na sposób konfigurowania reguł AUTOLOADINGU PSR-4 i PSR-0, kompozytor musi sprawdzić system plików przed ostatecznym rozwiązaniem nazwy klasy. To spowalnia trochę sprawy, ale jest to wygodne w środowiskach programistycznych, ponieważ po dodaniu nowej klasy, można ją natychmiast wykryć / użyć bez konieczności przebudowy konfiguracji automatycznego ładowania.

aby poprawić wydajność, Composer oferuje trzy poziomy optymalizacji; są to:

  • generowanie map klas
  • autorytatywne mapy klas
  • pamięć podręczna APCu

1: generowanie map klas

ta strategia konwertuje reguły PSR-4/PSR-0 Na reguły classmap. Ta strategia jest szybsza, ponieważ classmap może natychmiast zwrócić pełną ścieżkę do znanych plików i uniknąć operacji stat systemu plików.

aby włączyć ten poziom optymalizacji, uruchom następujące polecenie:

composer dump-autoload --optimize 

2/A: Autorytatywne mapy klas

oprócz automatycznego włączania poziomu 1, Podczas używania tego poziomu, jeśli klasa nie zostanie znaleziona w Wygenerowanej classmapie, autoloader nie będzie próbował szukać systemu plików zgodnie z regułami PSR-4. Aby włączyć ten poziom optymalizacji, uruchom następujące polecenie:

composer dump-autoload --classmap-authoritative 

2/B: pamięć podręczna APCu

ten poziom dodaje pamięć podręczną APCu jako rezerwę dla mapy klas. Nie generuje jednak classmap. Biorąc to pod uwagę, poziom pierwszy musiałby być włączony ręcznie. Aby włączyć ten poziom optymalizacji, uruchom następujące polecenie:

composer dump-autoload --apcu 

istnieją kompromisy

chociaż każdy z tych poziomów może poprawić wydajność aplikacji, każdy z nich ma kompromisy, które należy zrozumieć przed ich użyciem. Upewnij się, że zapoznałeś się z dokumentacją kompozytora przed ich użyciem.

użyj OPcache

ponieważ PHP jest językiem interpretowanym, a nie kompilowanym, środowisko wykonawcze PHP musi przekonwertować kod źródłowy na kod bajtowy wykonywalny, zanim będzie można go wykonać. Ponieważ PHP jest architekturą typu shared-nothing, proces ten musi się odbywać na każde żądanie.

jednak w przypadku pamięci podręcznej OPcache (OPcache) ten krok musi być wykonywany tylko raz dla każdego pliku, ponieważ wygenerowane kody mogą być buforowane w pamięci współdzielonej i tam się odwoływać.

Tak więc, jak możesz sobie wyobrazić, OPcache jest jednym z najmniej intensywnych sposobów poprawy wydajności aplikacji PHP, ponieważ żaden kod nie musi się zmieniać. Niektóre raporty wykazują poprawę prędkości o 70%.

przez lata było kilka buforów kodu Opcode dla PHP. OPCache (dawniej Zend Cache) został dołączony do PHP od wersji 5.5 — i jest domyślnie włączony w PHP 7.

aby dowiedzieć się więcej na ten temat, sprawdź dokumentację OPcache. Aby dowiedzieć się więcej o ulepszaniu wydajności OPcache, zapoznaj się z doskonałym artykułem Haydena Jamesa oraz postem Tideway na temat dostrajania go.

użyj wstępnego ładowania PHP 7

jeśli nie słyszałeś o nowej funkcji wstępnego ładowania PHP 7.4, ale jest to bardzo fajne! W skrócie, funkcja ta przenosi funkcjonalność Opcache dalej niż kiedykolwiek wcześniej.

aby szybko podsumować, przy pierwszym napotkaniu pliku źródłowego PHP, musi on zostać przetworzony, a następnie skompilowany do zależnego od maszyny kodu bajtowego, zanim silnik Zend będzie mógł go wykonać. Pamięci podręczne znacznie zmniejszają obciążenie tego procesu, ponieważ po pierwszym przetworzeniu i skompilowaniu kodu źródłowego bajtkody są następnie przechowywane w pamięci podręcznej Opcode w pamięci współdzielonej.

następnym razem, gdy pojawi się żądanie dla tego pliku, PHP sprawdza, czy bufor Opcode ma kody bajtowe dla pliku. Jeśli tak, są zwracane i używane. Jeśli nie (lub jeśli plik źródłowy zmienił się od czasu kompilacji bajtów), plik źródłowy jest parsowany, kompilowany i buforowany. Daje to znaczny wzrost wydajności PHP.

przyjrzyjmy się teraz, jak działa wstępne ładowanie. Zacytować implementujące RFC:

podczas uruchamiania serwera – przed uruchomieniem kodu aplikacji-możemy załadować określony zestaw plików PHP do pamięci – i uczynić ich zawartość “trwale dostępną” dla wszystkich kolejnych żądań, które będą obsługiwane przez ten serwer. Wszystkie funkcje i klasy zdefiniowane w tych plikach będą dostępne dla żądań po wyjęciu z pudełka, dokładnie tak samo jak jednostki wewnętrzne. Wstępne ładowanie zapewnia, że:

  • wszystkie funkcje i większość klas zdefiniowanych w tych plikach zostaną trwale załadowane do tabel funkcji i klas PHP i staną się trwale dostępne w kontekście każdego przyszłego żądania.
  • PHP rozwiązuje zależności klas i powiązania z rodzicem, interfejsami i cechami (coś, co nie dzieje się z buforowaniem kodu Opcode).
  • PHP usuwa niepotrzebne includes i wykonuje inne optymalizacje.

dzięki załadowaniu do pamięci kodu całej aplikacji, łącznie z jej frameworkiem (takim jak Zend Expressive, Symfony i Laravel), kodu, który zmienił się tylko podczas restartu serwera, większość aplikacji będzie działać znacznie lepiej.

to powiedziawszy, wstępne ładowanie ma kilka, potencjalnych, wad, o których powinieneś wiedzieć:

  • po zmianie plików źródłowych wymagany jest restart serwera.
  • Wstępne ładowanie nie działa we współdzielonych środowiskach hostingu.
  • Wstępne ładowanie nie działa, gdy istnieje wiele wersji tej samej aplikacji.

Wstępne ładowanie nie jest magiczne. Zarówno kod, jak i procesy wdrażania będą musiały zostać zrefakturowane, aby je wykorzystać. Na przykład ktoś będzie musiał opracować Niestandardowy skrypt loadera, aby określić, które pliki mają zostać załadowane podczas uruchamiania serwera, a ten skrypt będzie musiał zostać uruchomiony podczas uruchamiania serwera. Niezależnie od tego, jest to znaczna poprawa, w którą warto zainwestować!

użyj profilera

teraz, aby uzyskać opcję, która zajmie trochę więcej pracy niż którykolwiek z poprzednich pięciu. Często staramy się odgadnąć, gdzie znajdują się wąskie gardła wydajności w naszych aplikacjach, korzystając z intuicji i wykształconych domysłów.

chociaż mogą one działać, nie są najbardziej wydajnymi metodami. Zamiast tego możemy użyć profilerów kodu, aby przeanalizować nasz kod i pokazać, gdzie znajdują się wąskie gardła. W szczególności pomagają odpowiedzieć na następujące pytania:

  • ile razy wywoływano każdą metodę?
  • jaki był maksymalny czas wykonania każdej metody?
  • jaki był średni czas wykonania każdej metody?
  • ile razy był dołączony plik?
  • jaką ścieżkę prowadziło żądanie przez aplikację (od pierwszego do ostatniego pliku kodu)?

odwiercając się w wynikach profilera, często możesz być mile zaskoczony, choć prawdopodobnie zszokowany, gdy odkryjesz, że Twoja aplikacja wykonuje ścieżki kodu i klasy, których nigdy się nie spodziewałeś.

na podstawie informacji zawartych w raporcie profilera, ty i twój zespół możecie zacząć lepiej rozumieć, co robi Twoja aplikacja i dokonywać świadomych refaktoryzacji, aby ją zmienić, w razie potrzeby.

jeśli dopiero zaczynasz z profilowaniem, istnieje kilka opcji dostępnych dla PHP. Najczęściej stosowane są:

  • Xdebug ‘ s profiler
  • rozszerzenie Xhprof (& XHGui)
  • SPX Profiler
  • forp

Podsumowując

i to jest pięć sposobów na poprawę jakości aplikacji PHP. Każdy z nich na własną rękę zapewni Ci znaczną poprawę wydajności. Jednak, gdy używane razem, należy oczekiwać, aby zobaczyć znaczną wydajność, nie wspominając o jakości, poprawy.

Leave a Reply