Po ponad dziesięciu latach internetowy język PHP (czyli z ang. PHP Hypertex Preprocessor) przeżył swój prawdziwy renesans. Od 2015 roku jest dostępna wersja siódma a od 2020 wersja ósma tego najpopularniejszego języka wykorzystywanego do programowania back-endu aplikacji internetowych.
Aktualizacja ta przynosi wiele różnorakich zmian. W tym artykule prześledzimy jakie są to zmiany i skąd się bierze najważniejsza zaleta wykorzystywania wersji PHP 7 w istniejących aplikacjach – chodzi oczywiście o duży skok wydajności który przekłada się na mniejsze obciążenie serwera i szybsze działanie aplikacji.
Dużo lepsza wydajność kolejnych wersji – skąd ta różnica?
W przypadku omawiania różnic pomiędzy PHP5 a PHP7 najczęściej wymieniana jest ta związana z wydajnością. To zrozumiałe, jest to bowiem bardzo korzystna zmiana, tym bardziej, że przyspieszenie będzie odczuwalne zarówno w aplikacjach napisanych w starej wersji PHP, które uruchamiamy w PHP 7.

To brzmi wspaniale ale skąd ta różnica? Różnica w wydajności bierze się z bardzo prostego mechanizmu o nazwie Dead Code Elimination, czyli eliminacja martwego kodu. Został on wprowadzony w PHP 7.2 wzwyż. Optymalizacja interpretacji kodu polega na tym, że ignoruje ona instrukcje, które nie mają rzeczywistego wpływu na program. Najlepiej pokazać to wszystko na przykładzie:
function fn(){ $a = 1; return 0; }
W wersjach wcześniejszych niż 7.3, przypisanie liczby 1 do zmiennej $a zostanie faktycznie wykonane przez procesor. W PHP 7.3 instrukcja ta zostanie całkowicie pominięta.
Pamiętajmy przy tym, że w PHP zmienna $a jest zawsze lokalna jeżeli nie posłużono się instrukcją globals.

Ta zdawałoby się mała różnica w aplikacjach większej skali potrafi zaoszczędzić nawet około 50% czasu potrzebnego na wykonanie się kodu.
Aktualizacja PHP do wersji 8
Korzystanie z najnowszej wersji PHP będzie możliwe na wszystkich (samodzielnie zarządzanych) serwerach VPS. Czołowe hostingi wirtualne powinny dać możliwość migracji do nowszego środowiska krótko po premierze.
Przepaść jaka dzieli PHP 7.3 do PHP 8 jest zauważalna. Wszystko za sprawą mechanizmu JIT (ang. Just In Time). Polega to na pominięciu wszelkiego kodu, który w danym wywołaniu nie będzie miał wpływu na wynik działania programu.
Nowości w PHP 7.+
Poza lepszą wydajnością, wraz z nową wersją programiści mają do wykorzystania nowe instrukcje.
Deklaracje typów dla zwracanych wartości
W starszych wersjach PHP nie mamy możliwości zdefiniowania typu zwracanego przez funkcję lub metodę. W niektórych przypadkach, taka sytuacja mogła stanowić sporą wadę. Nie można łatwo zapobiec zwracania niechcianych typów i trudniej śledzić błędy. W PHP 7 można bez problemu zdeklarować typ zwracanych wartości przez funkcje i metody. Dostępne są cztery typy zwracanych wartości:
- bool,
- int,
- string,
- float.
Przykład:
<?php function suma($a, $b): float { return $a + $b; }
Wsparcie 64-bit
Nawet jeżeli dysponowaliśmy 64-bitowym systemem operacyjnym i sprzętem, PHP 5 nie oferował obsługi 64-bitowych liczb całkowitych oraz dużych plików. Wszystko z powodu podstawy PHP napisanej w C. W PHP7 jest prawdziwe wsparcie dla 64-bit co pozwoli wykonywać operacje możliwe w 64-bitowych architekturach systemu.
Obsługa błędów
Jeśli rozumiesz różnicę między błędem a wyjątkiem, wiesz, jak bardzo trudne było radzenie sobie z błędami krytycznymi w PHP 5. W PHP7 ułatwiono ten proces, ponieważ zastąpiono kilka poważnych błędów wyjątkami, które można rozwiązać w kodzie. Jest to możliwe dzięki wprowadzeniu nowych obiektów wyjątku silnika PHP.
Klasy anonimowe
W PHP 5 można było pisać kod całkowicie zgodny z paradygmatem obiektowym. Niektóre bardzo popularne konstrukcje znane z innych modnych języków programowania takich jak Java czy C# nie były możliwe do wykorzystania. Jedną z takich funkcji jest klasa anonimowa.
Klasa anonimowa jest przydatna w przypadku, gdy nie trzeba jej wykorzystywać więcej niż raz i nie trzeba jej dokumentować.
PHP 5:
class Logger { public function log($msg){ echo $msg; } } $util->setLogger(new Logger());
PHP 7:
$util->setLogger(new class { public function log($msg){ echo $msg; } });
Spaceship operator <=> operator statku kosmicznego
Wspomniana w ramach czystej ciekawostki instrukcja, która jest idealnym przykładem cukru syntaktycznego. Cukier syntaktyczny lub lukier składniowy (ang. syntactic sugar) to instrukcja która realizuje zazwyczaj prostą operację, którą łatwo uzyskać za pomocą kilku innych. Wprowadza się je do języków programowania aby zwiększyć czytelność i ułatwić pracę programiście.
PHP5:
function sortuj ($a,$b){ if ($a>$b) return 1; else if ($a==$b) return 0; else return -1; }
PHP7:
function sortuj ($a,$b){ return $a < = > $b; }
Nowości w PHP 8
Wersja ósma również przynosi kilka istotnych zmian.
Unie typów:
W PHP, który i tak jest dynamicznie typowany (w PHP 7 wprowadzono typowanie) czasem może być potrzeba wykorzystania więcej niż jednego typu. Jest to możliwe za pomocą unii.
public function metoda(Foo|Bar $input): int|float;
Nazwane argumenty
Nazwane argumenty umożliwiają przekazywanie wartości do funkcji, określając nazwę wartości, dzięki czemu nie trzeba brać pod uwagę ich kolejności, a także można pominąć parametry opcjonalne:
A także:
- operator nullsafe,
- wyrażenie match,
- typ mixed,
I wiele więcej…
Zalety aktualizacji PHP
- dużo większa wydajność dzięki optymalizacji polegającej na ignorowaniu instrukcji niemających wpływu na program,
- możliwość wykorzystania nowych rozwiązań zwiększającą czytelność kodu,
- łatwiejsza nauka, możliwość wykorzystania przyzwyczajeń z programowania Java i C# (dodanie funkcji lambda, deklaracje typów itd.),
- zwiększone bezpieczeństwo (usunięcie z PHP problematycznych instrukcji np. uniemożliwiono dodawanie własnej soli do funkcji password_hash()).
Wady aktualizacji PHP
Nie są to wady samego PHP, ale aktualizacja interpretera w starszych aplikacjach (napisanych w PHP 5 i wcześniejszym) może przysporzyć niepotrzebnego kłopotu i frustracji. Jeżeli aplikacja nie jest kompatybilna z PHP7 należy po prostu ten temat odpuścić do następnej aktualizacji strony lub aplikacji – nic nie jest wieczne. Przeróbka kodu polegająca na tym aby był kompatybilny z PHP7 jest możliwa w stosunkowo prostych aplikacjach.
- brak 100% kompatybilności (istniejące aplikacje mogą przestać działać jeżeli wykorzystano zdeprecjonowane funkcje),
- konieczność zmiany kilku przyzwyczajeń,
- starsze frameworki (np. Kohana) nie są kompatybilne z PHP7, próby naprawy mogą być uciążliwe i nieopłacalne.
Rozwiązywanie najczęstszych problemów po aktualizacji PHP do wersji 7
MySQL
Jeden z najczęstszych mitów dotyczących aktualzacji PHP5 do PHP7 głosi, że w PHP7 musimy korzystać z PDO. Nie jest to prawda, wystarczy instrukcję mysql_ podmienić na mysqli_ i dodać obiekt połączenia jako pierwszy argument.
Jeżeli w PHP5 mamy taki kod:
$connection = mysql_connect( 'host', 'username', 'password'); $database = mysql_select_db( 'database');
W PHP7 wystarczy tak naprawdę drobna modyfikacja:
$connection = mysqli_connect( 'host', 'username', 'password', 'database'); $database = mysqli_select_db($connection, 'database');
Dodanie „i” do słów kluczowych sprawdza się także w innych przypadkach:
MySQL | MySQLi |
mysql_affected_rows | mysqli_affected_rows($connection) |
mysql_close | mysqli_close($connection) |
mysql_data_seek | mysqli_data_seek $result, $offset) |
mysql_errno | mysqli_errno($connection) |
mysql_error | mysqli_error($connection) |
mysql_fetch_array | mysqli_fetch_array($result, $type) |
mysql_fetch_assoc | mysqli_fetch_assoc($result) |
mysql_fetch_lengths | mysqli_fetch_lengths($result) |
mysql_fetch_object | mysqli_fetch_object( $result, $class, $params) |
mysql_fetch_row | mysqli_fetch_row($result) |
mysql_field_seek | mysqli_field_seek($result, $number) |
mysql_free_result | mysqli_free_result(result) |
mysql_get_client_info | mysqli_get_client_info($connection) |
mysql_get_host_info | mysqli_get_host_info($connection) |
mysql_get_proto_info | mysqli_get_proto_info($connection) |
mysql_get_server_info | mysqli_get_server_info($connection) |
mysql_info | mysqli_info($connection) |
mysql_insert_id | mysqli_insert_id($connection) |
mysql_num_rows | mysqli_num_rows($result) |
mysql_ping | mysqli_ping($connection) |
mysql_query | mysqli_query($connection, $query) |
mysql_real_escape_string | mysqli_real_escape_string($connection) |
mysql_select_db | mysqli_select_db($connection, $database) |
mysql_set_charset | mysqli_set_charset($connection, $charset) |
mysql_stat | mysqli_stat($connection) |
mysql_thread_id | mysqli_thread_id($connection) |
Funkcje zdeprecjonowane
W PHP7 nie wykorzystamy pewnych funkcji znanych z PHP5, tutaj znajduje się cała lista funkcji, które nie będą się wykonywać i wygenerują błąd: https://www.php.net/manual/en/migration70.deprecated.php
Aktualizacja PHP na serwerze VPS (i serwerach dedykowanych)
Jeżeli dysponujemy Linuxowym serwerem aktualizacja sprowadza się do wpisania kilku komend w konsoli.
sudo apt update
sudo apt upgrade
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt install php7.3 (dla Apache)
Możemy sprawdzić za pomocą komendy php -v czy instalacja przebiegła poprawnie.
Za pomocą komendy sudo apt install php7.3-nazwa_rozszerzenia instalujemy rozszerzenia np:
sudo apt install php7.3-common php7.3-mysql php7.3-xml php7.3-xmlrpc php7.3-curl php7.3-gd php7.3-imagick php7.3-cli php7.3-dev php7.3-imap php7.3-mbstring php7.3-opcache php7.3-soap php7.3-intl -y
Po wszystkim przydatna może być edycja pliku PHP.ini
sudo nano /etc/php/7.3/fpm/php.ini
Aktualizacja PHP w cPanel
Tutaj sprawa jest prosta, wybieramy Oprogramowanie >> Zmiana wersji PHP. Po wybraniu wersji możemy ustawić tę wersję PHP jako bieżącą. Za pomocą checkboxów możemy włączać dowolne rozszerzenia.
Aktualizacja PHP w hostingu Home
Zmiana wersji PHP w hostingu home jest możliwa za pomocą .htaccess:
<FilesMatch "\.php$"> SetEnv CGI_HANDLER php73 </FilesMatch>
Plus jest taki, że możemy zmieniać wersję PHP w zależności od konkretnego katalogu.
Aktualizacja PHP w hostingu Nazwa
Zmiana wersji PHP w nazwie jest możliwa za pomocą panelu Active.admin. Przechodzimy do Ustawienia >> Ustawienia WWW PHP.
W wygodnej liście rozwijalnej możemy wybrać najnowszą wersję PHP.
Aktualizacja PHP w hostingu OVH
W OVH możemy wykorzystać podobny trick jak w Home z tą różnicą że nie tworzymy pliku .htaccess a specjalny .ovhcontrol
W pliku tym nalezy dodać następujące wartości:
app.engine=php app.engine.version=7.3 http.firewall=none environment=production container.image=stable
Opcja environment z wartością production włącza dodatkowy cache na poziomie PHP, który odciąża hosting i może przyspieszać wykonywanie się skryptów.
Oczywiście, w OVH jaki pierwsi mamy możliwość włączenia PHP 8 pomimo tego, że znajduje się on w wersji testowej. W informacjach ogólnych mamy specjalny przycisk do zmiany wersji. Po wybraniu takich opcji aktualizujemy:

Jak sprawdzić wersję PHP i zainstalowane rozszerzenia?
Niezaleznie od hostingu, można stworzyć plik phpinfo.php i dodać w nim jednąinstrukcję:
<?php
phpinfo();
To pozwoli zapoznać się z tabelką, którą nie raz pokazywałem na tym blogu:

Podsumowanie
Aktualizacja wersji PHP nie należy do skomplikowanych działań. Niektórzy dostawcy hostingu wirtualnego umożliwiają włączyć różne wersje PHP dla osobnych folderów co ułatwia utrzymywanie wielu różnych stron na jednym serwerze.
Źródła
https://www.php.net/manual/en/functions.returning-values.php
https://www.php.net/manual/en/language.oop5.anonymous.php
https://www.php.net/manual/en/migration70.new-features.php
Odpowiedz lub skomentuj