„Skrypcik w PHP”, czyli o współczesnym PHP

avatar icon blog author
#TeamSpeednet

Mimo że w tym roku język PHP kończy 20 lat, a za tydzień powinniśmy ujrzeć finalną wersję PHP 7.0, to nadal spora grupa osób (szczególnie związanych z innymi technologiami) traktuje PHP po macoszemu i sądzi, że służy tylko do robienia prostych stronek. Powodem takich stwierdzeń jest początkowy okres istnienia języka, gdy PHP służył do naprawdę prostych rzeczy jak wysłanie maila na podstawie danych z formularza, stworzenia licznika odwiedzin, czy złączenia kilku plików HTML w jeden widok (header, content, footer). Wszystko zaczęło się zmieniać wraz z pojawieniem się PHP 5.0 w 2004 roku. Wtedy pojawił się nowy model obiektowy, dzięki któremu rozpoczęła się epoka frameworków w PHP.

Najważniejsze frameworki

W 2005 roku rozpoczęły się prace nad nieszczęsnym Symfony 1.0 (wydane 2007), który OOP nie widział na oczy, ale zaczął gromadzić wokół siebie społeczność programistów. Społeczność, która później stworzyła bardziej obiektowe rozwiązanie wspierające komponenty, bundle, OOP i inne rozwiązania pod postacią Symfony 2.0. Chwilę po rozpoczęciu prac nad Sf 1.0, ale z lepszym początkiem, w 2006 roku wystartował Zend Framework. ZF już w pierwszej wersji starał się być w pełni obiektowy, porzucając dotychczasowe praktyki programistów PHP (wszystko w jednym pliku, funkcje zamiast klas itp.) Obecnie na rynku jest Zend Framework 2, którego pierwsze wydanie miało miejsce w 2012 roku. ZF2 wykorzystał najnowsze trendy w PHP dostępne w tamtej chwili (np. przestrzenie nazw). W momencie, gdy pojawiła się oficjalna wersja ZF2, rozpoczęły się prace nad innym frameworkiem o którym warto wspomnieć, ponieważ nie jest napisany w języku PHP ale dla programistów PHP. Phalcon, bo o nim mowa, został stworzony jako rozszerzenie do PHP (PECL) dzięki czemu teoretycznie jest szybszy od swoich starszych braci ale wymaga ingerencji w konfigurację serwera jak również trochę innego podejścia w tworzeniu aplikacji. Oczywiście są także takie frameworki (a raczej CMS-y) jak Drupal, Joomla czy Wordpress, których i jakość kodu jest kiepska i architektura rozwiązań nie najlepsza. Ale to jest jakby inna część PHP. Ale i również te projekty dojrzewają. Najnowszy Drupal bazuje już na Symfony 2, zakończyły się prace nad wykorzystaniem Sf2 w popularnym forum phpBB, niedługo również powinien być dostępny sklep prestaShop oparty o ten popularny framework.

Narzędzia

PHP to już nie tylko sam język czy frameworki. To również pełna gama przeróżnych narzędzi. Programiści mają Composera, który w mig instaluje wszelkie zależności projektu, frameworka czy użytych bibliotek. Od wielu lat możemy pisać testy jednostkowe dzięki Sebastianowi Bergmannowi, który jeszcze na studiach stworzył zalążek phpUnit i rozwija do dzisiaj to narzędzie. Obecnie phpUnit dostępny jest w wersji 5.0 i w pełni wspiera PHP 7.0. Możemy w prosty sposób sprawdzić pokrycie kodu testami jednostkowymi dzięki xDebug lub rozszerzeniu php-dbg. Programiści PHP mają także stworzony z myślą o nich IDE w postaci PhpStorm i wiele innych narzędzi.

Rozwój PHP

Do wersji PHP 4 był to rzeczywiście język skryptowy, który polegał głównie na tworzeniu include/require małych plików do stron HTML. Zdarzały się pierwsze połączenia do bazy danych poprzez mysql_connect lub odpowiedniki. Tak powstały pierwsze sklepy internetowe opierające się głównie na $_GLOBALS. Stworzenie sklepu było bardzo szybkie, ale najczęściej posiadał on wiele dziur bezpieczeństwa, o których wtedy się nie myślało. Jak już wspomniałem wszystko zaczęło się zmieniać wraz z pojawieniem PHP 5.0 i kolejnych wersji minor. Każdy nowy minor poprawiał szybkość działania, ale nie tylko. Oto najważniejsze nowości jakie pojawiły się od 2005 roku w PHP od 5.1:

  • PHP 5.1
    • Added PHP Data Objects (PDO) as a consistent interface for accessing databases.
  • PHP 5.2
    • Enabled the filter extension by default
    • Native JSON support.
  • PHP 5.3
    • FastCGI Process Manager
    • Namespace support
    • Late Static Bindings
    • jump label (limited goto)
    • closures
    • PHP archives (phar)
    • garbage collection for circular references
    • sqlite3
    • mysqlnd as a replacement for libmysql as underlying library for the extensions that work with MySQL
    • fileinfo as a replacement for mime_magic for better MIME support
    • the Internationalization extension, and deprecation of ereg extension.
  • PHP 5.4
    • Trait support
    • short array syntax support
    • Built-in web server.
  • PHP 5.5
    • Support for generators
    • finally blocks for exceptions handling
    • OpCache (based on Zend Optimizer+) bundled in official distribution
  • PHP 5.6
    • Constant scalar expressions
    • variadic functions
    • argument unpacking
    • new exponentiation operator (**)
    • new phpdbg debugger as a SAPI module
  • PHP 7.0
    • Zend Engine 3
    • uniform variable syntax
    • AST-based compilation process
    • added Closure::call()
    • bitwise shift consistency across platforms
    • ?? (null coalesce) operator
    • Unicode codepoint escape syntax
    • return type declarations
    • scalar type (integer, float, string and boolean) declarations
    • <=> "spaceship" three-way comparison operator
    • generator delegation
    • anonymous classes
    • replacement of many remaining internal PHP "errors" with the more modern exceptions

Patrząc na listę nowości, szczególnie nadchodzącego PHP 7.0 można powiedzieć, że PHP niczym nie ustępuje innym językom, chociażby takim jak Java. Są już domknięcia, traity, klasy i funkcje anonimowe.

Wydajność

Największa zaleta języka PHP - jego dynamiczność - od samego początku stała się również jego największą wadą. Stworzony z myślą o CGI nie radził sobie z podobnymi zapytaniami HTTP, większymi danymi czy dużych ruchem. Kolejne wersje PHP starały się poprawiać wydajność, nadal jednak pozostając językiem dynamicznym. Moim zdaniem należy podkreślić 3 największe zmiany w rdzeniu PHP jakie zaszły:

  • PHP 5.3.3 - oficjalne dodanie PHP-FPM, tzw. zarządcy procesów, który zastąpił wysłużone FastCGI i zaczął wspomagać web-server w dużych obciążeniach
  • PHP 5.5.0 - oficjalne dodanie OpCache, które dzięki przechowywaniu prekompilowanego bajtkodu mocno przyspiesza kolejne odwołania do tych samych partii kodu
  • PHP 7.0.0 - nowy silnik w postaci PHP-NG, użycie go od tak podnosi wydajność aplikacji średnio 2x

Przy stworzeniu nowego silnika PHP-NG, który zastąpił Zend Engine wykonano ogrom pracy przyspieszając bardzo mocno sam PHP (porównywalne do HHVM), jednocześnie zachowując kompatybilność z PHP 5.6. Wordpress jest obecnie najpopularniejszym CMS-em, który używany jest przez 58.8% rynku (25.2% udziału ma jeśli weźmiemy pod uwagę cały Internet). Wyłącznie przejście z PHP 5.6 na PHP 7.0 przyspiesza działanie bloga opartego na WP z 191 req/s do 374 req/s. Ot tak. To niesamowite, że taka "mała" zmiana tak bardzo może przyspieszyć nasz serwis.