PHP 7 – kompilacja & optymalizacja

Ale ten czas szybko płynie. Dopiero co opisywałem Wam przepis na kompilację PHP 5.4 (2013), a za rogiem czeka już PHP 7.3.

Mimo upływu 5 lat dużo się nie zmieniło w samej konfiguracji kodu źródłowego i kompilacji. Podstawa to posiadanie w Linuksie gcc/g++ oraz pakietów -dev (głównie pliki nagłówkowe .h), dla rozszerzeń z których będziemy korzystać. Poniżej lista pakietów dla Debiana, które są przydatne:

Na pewno zapytacie po co to wszystko? W dawnych czasach nie wszystkie dodatki PHP były przygotowane w paczkach danej dystrybucji i po pewnym czasie trzeba było pobierać kod źródłowy, skonfigurować i skompilować i tak. Dlaczego nie zrobić tego od razu?
W tamtych czasach również kompilacja pomagała odpowiednio sprofilować PHP pod daną konfigurację (czy ktoś jeszcze korzysta z Gentoo?).
Obecnie główna przewaga takie podejścia, to posiadanie kilku różnych instanacji PHP w różnych wersjach na jednej maszynie (bo mamy różne projekty, różnych klientów etc). Jak również można sprofilować PHP pod konkretną jedną aplikację (prof-gen & prof-use).

Ja nadal zawsze kompilują PHP, wtedy w przypadku dysków HDD mamy ciut mniejsze obciążenia i większą swobodę działania. Jeśli już wykonałeś poprzedni krok wystarczy pobrać kod źródłowy wybranej przez nas wersji PHP (np. 7.2.12). Jeśli nie chcecie za każdym razie przeklikiwać się przez stronę https://php.net/downloads.php możecie użyć prostego skrypciku:

Wtedy gdy dostaniesz informację o nowej wersji wystarczy, że wydasz polecenie ./php_get 7.2.12. Jak już mamy paczkę .tar.gz na dysku musimy rozpakować źródła i w katalogu, który powstanie umieszczamy nasz przepis na kompilację.
Jak taki przepis wygląda? Wszystko zależy, z czego Wasze aplikacje PHP korzystają, a może jest to serwer, gdzie serwujecie rózne aplikacje i wymagacie różnych bibliotek. Mój uniwersalny przepis, z którego korzystam to:

Czasami różni się w zależności od potrzeb. W dużym skrócie – sprzątamy po poprzedniej kompilacji, konfiguruejmy nasz przepis oraz puszczamy machinę w ruch. Opcja -j2 oznacza, że kompilacja wykona się na 2 jobach. Potrwa to dobrych kilka minut.
I ostatecznie wszystko zainstaluje się zgodnie z przepisem, tj. w /usr/local/php72 (dzięki takiemu podejściu łatwo później posprzątać po poprzedniej wersji, np. php70).

Konfiguracja dla środowiska PHP jest czytana z lokalizacji /usr/local/php72/lib/php.ini (ja mam i tak w /etc/php72.ini, a we właściwym miejscu link symboliczny, ułatwia to tworzenie kopii zapasowych konfiguracj):

Początkowo tego pliku nie ma. Możemy go tam przenieść z kodów źródłowych ( php-7.2.12/php.ini-production). Nie jest to do końca optymalna konfiguracja, nie wiem dlaczego. Podstawowe zmiany, które powinniście zrobić to:

W planach jest, aby w PHP 7.4 doszła opcja preload, która wstępnie załaduje wymagane biblioteki i frameworki do opcache. Dzięki temu pierwsze załadowanie strony przez Klienta będzie trwało równie krótko jak przy kolejnych odwiedzinach (bajtkod będzie już w pamięci serwera).

To co obecnie również potrzebujemy to wstępna konfiguracja PHP-FPM, który na dobre zadomowił się w PHP i obsługuje cały proces zarządzania procesami PHP (pięknie współgra z opcache). Kopiujemy plik i robimy odpowiednie wiązania symboliczne na przyszłość:

Domyślnie w pliku konfiguracyjnym php-fpm nie ma skonfigurowanego żadnego pool-a, jak również możemy rozbudować domyślną konfigurację. Ja zawsze bazuję na połączenia portowych. Nasz plik może przybrać taką postać:

Pozostaje nam już tylko kwestia podnoszenia (uruchamiania) PHP-FPM. Obecnie zamiast skryptów init.d używa się systemd. Zatem do dzieła:

I od teraz możemy w naszym serwerze WWW (np. Apache lub nginx) korzystać z możliwości przetwarzania żądań PHP za pomocą portu 7200. Wystarczy w definicji naszego vhosta w nginx dodać następującą konfigurację dla plików z rozszerzeniem .php:

Pamiętajcie, że ustawiliśmy rewalidację opcache na 120 sekund. W zależności od potrzeb (produkcja / dev) możemy ten czas dowolnie skonfigurować pod własne potrzeby. Opcache robi największą robotę w przyspieszeniu PHP 7 (a za nim przebudowa struktur danych w jądrze), więc warto poświęcić trochę czasu i dostosować powyższą konfigurację php.ini pod swoje potrzeby.