Phalcon = wysoka wydajność?!

Phalcon PHP

Phalcon is a web framework implemented as a C extension offering high performance and lower resource consumption.

There are many PHP frameworks nowadays, but none of them is like Phalcon (Really, trust us on this one).

To pierwsze dwa zdania, które wprowadzają nas w świat Phalcon przez ich autorów.

Phalcon znalazłem kilka dni temu. Miałem chwilę czasu, więc wykorzystałem ją na jego bliższe poznanie, bo.. zainteresowały mnie powyższe dwa stwierdzenia oraz grafika, która prezentowana jest na stronie głównej. Pokazano na niej wykres wydajności poszczególnych frameworków i oczywiście Phalcon znacznie przebija na nim konkurencję.

Ale jak?

Spędziłem kilkanaście minut na zapoznanie się z dokumentacją, gdzie twórcy wyjaśniają skąd wziął się pomysł na kolejny framework i dlaczego zbudowany został on w taki a nie inny sposób. Mianowicie chcieli oni wyeliminować wszystkie negatywne cechy istniejących frameworków, czyli między innymi:

  • dużą ilość potrzebnych zasobów, które muszą zostać stworzone i zarezerwowane by udostępnić podstawowe funkcjonalności – duża liczba inkludowanych plików i duże wykorzystanie dysku twardego
  • dużą ilość niewymaganych funkcjonalności, których nigdy nie wykorzystamy bądź nie są one potrzebne za każdym razem gdy przetwarzane jest żądanie HTTP – duża ilość pamięci ram, która potrzebna jest do załadowania tego wszystkiego
  • za każdym razem wszystkie pliki są interpretowane od nowa, a przecież kod frameworka nie zmienia się tak często jak część biznesowa odpowiedzialna za naszą aplikację – procesor za każdym razem musi się napocić by wykonać taką interpretację kodu PHP

Rozszerzenie w C!

Jak im się to udało? Przyjrzyjmy się zaletom rozszerzeń PHP w postaci bibliotek napisanych w języku C:

  • rozszerzenia napisane w języku C ładowane są RAZ razem z PHP podczas procesu startu serwera
  • wszystkie klasy i funkcje gotowe są do użycia w dowolnej aplikacji
  • kod nie jest za każdym razem interpretowany, bo został on już wcześniej skompilowany do postaci wykonywalnej na danej platformie i przez dany procesor

Run it on Phalcon!

Jak działa w takim razie Phalcon? Otóż jest to właśnie rozszerzenie do PHP napisane w języku C i ładowane jest tylko i wyłącznie RAZ – podczas startu serwera, który uruchamia także interpreter PHP. Dlaczego więc Phalcon?

  • wszystkie komponenty oraz klasy są ze sobą bardzo luźno powiązane – możemy dowolnie dobierać sobie funkcjonalności i wykorzystywać wszystko co daje nam framework lub tylko wybrane komponenty
  • optymalizacja na niskim poziomie
  • interakcja z bazą danych przy użyciu ORM napisanego w języku C
  • użycie natywnej obsługi PHP w języku C

Sami przyznacie, że wygląda to bardzo obiecująco.

Podsumowanie

Poza bardzo dobrą dokumentacją – twórcy przygotowali także ciekawe przykłady, które pokazują użycie Phalcon w różnych projektach, o różnych profilach działania.

Wyniki benchmarków, które prezentowane są oficjalnej stronie, pokazują, że taka budowa frameworka ma sens i rzeczywiście przyspiesza wykonywanie zapytań. Sam także pokusiłem się o przykład Hello World w Symfony 2.3.2, Slim oraz Phalcon. Wynik? Symfony i Slim ładują się jakieś ~50ms, a Phalcon ~10ms!

Zachęcam tym samym do zapoznania się z całą dokumentacją oraz własnych eksperymentów. Z pewnością nie jest to moje pierwsze spotkanie z Phalcon.

Aktualizacja

W odpowiedzi na komentarz, gdzie jego autor prosił mnie o dodatkowe testy przy wykorzystaniu Apache Benchmark. Testy wykonywane były na jednej maszynie w środowisku Windows w oparciu o instalację XAMPP (Apache 2.4.3 oraz Apache Benchmark 2.3). Testowane było wywołanie strony głównej za którą odpowiedzialny był jeden kontroler z jedną pustą metodą i widok z tekstem “Hello world!”. Jest to więc sytuacja bardzo podobna do przykładu twórców frameworka. Dodam też, że środowisko to tryb deweloperski z włączonym trybem debuggera oraz wyłączonym cache.

Poniżej skrócone wyniki dla:

  • 100 równloległych połączeń dla 1000 zapytań
    Concurrency Level:      100
    Time taken for tests:   5.626 seconds
    Complete requests:      1000
    Failed requests:        0
    Write errors:           0
    Total transferred:      429000 bytes
    HTML transferred:       213000 bytes
    Requests per second:    177.74 [#/sec] (mean)
    Time per request:       562.632 [ms] (mean)
    Time per request:       5.626 [ms] (mean, across all concurrent requests)
    Transfer rate:          74.46 [Kbytes/sec] received
  • 1000 równloległych połączeń dla 10000 zapytań
    Concurrency Level:      1000
    Time taken for tests:   13.292 seconds
    Complete requests:      1000
    Failed requests:        8
       (Connect: 8, Receive: 0, Length: 0, Exceptions: 0)
    Write errors:           0
    Total transferred:      429000 bytes
    HTML transferred:       213000 bytes
    Requests per second:    75.23 [#/sec] (mean)
    Time per request:       13291.760 [ms] (mean)
    Time per request:       13.292 [ms] (mean, across all concurrent requests)
    Transfer rate:          31.52 [Kbytes/sec] received
  • 100 równloległych połączeń dla 100000 zapytań
    Concurrency Level:      100
    Time taken for tests:   219.302 seconds
    Complete requests:      100000
    Failed requests:        0
    Write errors:           0
    Total transferred:      42900000 bytes
    HTML transferred:       21300000 bytes
    Requests per second:    455.99 [#/sec] (mean)
    Time per request:       219.302 [ms] (mean)
    Time per request:       2.193 [ms] (mean, across all concurrent requests)
    Transfer rate:          191.04 [Kbytes/sec] received

Przy większej ilości równoległych połączeń dla liczby zapytań większej niż 1000 moja instalacja Apache niestety nie dawała rady. Widać jednak, że wydajność Phalcon nie jest przesadzona.