Czy Node.js naprawdę jest lepszy od PHP 7?

Przez ostatnie kilka lat w obszarze aplikacji internetowych możemy zaobserwować spore zróżnicowanie na tle narzędzi oraz technologii, które mogą wprowadzić w pewien dysonans zwłaszcza nowych deweloperów. Wybrać rozwiązania dojrzałe i sprawdzone, czy też podążać za najnowszymi trendami? Przed takim problemem staje prawie każdy nowy programista back-end, który słyszał o PHP oraz Node.js. Spotyka on również programistów PHP z długoletnim stażem, znużonych ciągłym klepaniem kodu w tym samym, starym języku, co nie pomaga mu w decyzji o wyborze rozwiązania.

Robert Rachlewicz. Projektant PHP w Unity Group. Absolwent Akademii Górniczo-Hutniczej, programista z ponad 12-letnim doświadczeniem, w Unity Group od 2015 roku. Zajmuje się backendem (Spryker), specjalizuje się w projektach e-commerce’owych. Miłośnik czystego kodu, siatkówki i dobrej muzyki.


Na które rozwiązanie się zdecydować? Co wybrać by nie tracić czasu? Nie istnieje jednoznaczna odpowiedź, najlepiej wybrać technologię, która pozwoli pokryć jak najwięcej potrzeb projektu. Co w przypadku, kiedy obie technologie są w stanie to zrobić? Tu zaczyna się nasz problem, szukamy informacji, przeglądamy fora internetowe, statystyki, czytamy komentarze, pytamy znajomych, analizujemy to co udało się nam zebrać. W naszym bogatym zasobniku wiedzy, jakim jest Internet, możemy znaleźć dużo cennych informacji, ale również dużą ilość krytyki.

W tym krótkim artykule zbierzemy kilka ważnych uwag i zastanowimy się, co jest dla nas najistotniejsze w doborze odpowiedniej technologii.

Partnerzy z przeszłości

Do początku 2009 roku PHP oraz JavaScript traktowano jako uzupełniających się partnerów, którzy wspólnie rządzili Internetem. Partnerstwo opierało się na prostych zasadach, JavaScript obsługiwał kilka szczegółów w przeglądarce, PHP zarządzał zadaniami po stronie serwera, jako jedyny kolegował się z bazą danych. Zazdrość JavaScript-u o to, czym zajmuje się i za co odpowiada jego partner doprowadziła w 2009 roku do powstania Node.js, dzięki któremu może on również być wykorzystywany do obsługi backend-owej. Od tamtej chwili partnerstwo przestało być już tak bardzo istotne, zrodziło to w pewnym rodzaju wyścig o pozycję lidera pod względem tworzenia aplikacji. 

Od tamtego momentu na różnego rodzaju portalach tematycznych, forach internetowych, grupach facebookowych możemy znaleźć opinie programistów, przeważnie na niekorzyść PHP. Część opinii jest uzasadniona, część nie, porównajmy kilka informacji by móc wyciągnąć wnioski.

Czas płynie, cyferki się zmieniają

Na początek porównamy kilka podstawowych informacji między obiema technologiami, sprawdzając ich popularność i konkurencyjność.

Dane pochodzą z:

  1. https://thinkmobiles.com/blog/php-vs-nodejs/
  2. http://php.net/supported-versions.php
  3. https://nodejs.org/en/about/releases/

Obie platformy są rozwijane, praktycznie co roku wydawane są kolejne wersje. Pełnoletni PHP aktualnie wydany w wersji 7.3.2 z racji na swój wiek posiada więcej open source-owych projektów niż Node.js. Długoletnia i pełna różnych przykładów jest również dokumentacja PHP. Obaj konkurenci posiadają własne wsparcie repozytorium zależności, ale to młodszy Node.js wygrywa w ilości dostępnych paczek/modułów do pobrania. Odzwierciedlenie tego faktu widać w liczbie gwiazdek w serwisie GitHub, gdzie Node.js posiada ich znacznie więcej niż przeciwnik.

Pod względem wydawniczym, twórcy PHP każdego roku wydają kolejną wersję, zapewniając jednocześnie wsparcie poprzedniej wersji na kolejny rok. Twórcy Node.js również wydają kolejne wersję co rok, wspierając poprzednie do maksymalnie roku. W przypadku licencji nie znajdziemy również dużych różnic, zarówno PHP jak i Node.js posiadają licencje otwartego oprogramowania. 

Należy wspomnieć o jeszcze jednej, bardzo ważnej informacji: porównujemy najnowsze, stabilne i dostępne wersje. Kolosalna przewaga w ilości modułów dostępnych dla Node.js wynika z rewolucji, jaka powstała w dniu jego wydania (2009). Była to o wiele lepsza alternatywa dla PHP w wersji 5, który był po prostu wolny, a z jego szybkością i rozwojem nie działo się nic ciekawego. Były to czasy, gdzie czekano na wydanie PHP w wersji 6, do czego nigdy nie doszło. Potencjalnie znalazło się wtedy miejsce dla Node.js, rozpoczęto tworzenie rozwiązań, które miały zaspokoić potrzeby funkcjonalne, zastąpić stare nieefektywne rozwiązania. Ten czas trwał aż do wydania w 2015 roku wersji PHP 7.0, w którym poprawiono znacznie wydajność, niektóre składowe PHP zostały zrefaktoryzowane lub zaimplementowane na nowo. Pierwsze benchmarki PHP 7 vs Node.js 6.11 przedstawiają przewagę PHP nad konkurentem. Polecam porównanie z tamtego okresu, które można znaleźć pod adresem.

Kto i za co teraz odpowiada?

Posiadając podstawową wiedzę historyczną, uwzględniając wszelkie dokonane optymalizacje dla najnowszej wersji PHP, dalej nie jesteśmy w stanie odpowiedzieć na pytanie, która z technologii będzie najlepiej pasować do naszych potrzeb. Tak naprawdę każda z platform ma lepsze i gorsze cechy.

Specyfiką Node.js jest wykorzystywanie pętli zdarzeń JavaScript do tworzenia niezablokowanych aplikacji wejścia/wyjścia, które z łatwością obsługują wiele jednoczesnych zdarzeń. Przetwarzanie asynchroniczne JavaScript-u pozwala tworzyć wysoce skalowalne rozwiązania po stronie serwera, maksymalizując przy tym wykorzystanie jego procesora i pamięci. Ta funkcjonalność sprawia, że Node.js najlepiej nadaje się aplikacji asynchronicznych np. aplikacji RTA (aplikacje czasu rzeczywistego), SPA (aplikacje jednostronicowe). Należy również brać pod uwagę że używając Node.js po stronie backend-owej, nasz cały kod piszemy w JavaScript. 

Aplikacja frontowa przy użyciu odpowiednich frameworków np. react, angular również może być stworzona całkowicie w JavaScript. Pisanie backendu, jak i frontu w tym samym języku znacznie ułatwia prowadzenie projektu z prostych przyczyn: programista backend oraz programista frontend posługują się tymi samymi strukturami danych, funkcjami i konwencjami językowymi. Kolejną, dość ważną cechą jest brak narzucania ścisłych konwencji przez Node.js. Pozwala to programistą wybrać najlepszą architekturę, wzorce oraz moduły. 

Node.js jak wszystko, posiada również swoje wady. Środowisko działa w trybie jednowątkowym, opartym na zdarzeniach. Aplikacja przestanie odpowiadać lub znacznie zwolni w przypadku operacji intensywnie wykorzystujących procesor takich jak przetwarzania dużych plików, dużych ilości danych, edycji obrazów. Ekosystem modułów jest wciąż niedojrzały. Trudno jest ocenić jakość wybranego modułu przed jego instalacją w aplikacji. Dzięki łatwości publikowania własnych pakietów w połączeniu z brakiem niezawodnego mechanizmy zatwierdzania modułu może oznaczać, że powinieneś bardziej zwracać uwagę podczas wybierania modułów, weryfikować jego ostatnie aktywności takie jak poprawki błędów czy aktualizacje. Im młodszy moduł, tym większy potencjał ja błędy w nim zawarte.

PHP jest wysoce przenośnym rozwiązaniem do tworzenia aplikacji. Uruchomimy go praktycznie pod każdym serwerem z Linux-em, posiada on również bardzo dobre wsparcie dla Windows oraz Mac OS. Zaprojektowany został głównie do pracy w sieci. Zawiera wszystkie potrzebne funkcje do zarządzania różnymi bazami danych oraz systemami buforowania pamięci podręcznej takimi jak Memcache czy Redis. Dzięki kompleksowemu rozwiązaniu po stronie PHP, nie ma potrzeby zajmowania się JavaScriptem w przeglądarce, ponieważ wszystkie elementy strony otrzymamy wygenerowane z poziomu serwera.

Jest to też jego wada, ponieważ renderowanie zawsze odbywa się po stronie serwera, w przypadku wzmożonego ruchu może doprowadzić do znacznego spowolnienia działania strony. Nie jest to jednak tak duże ograniczenie, ponieważ przy użyciu Varnish Cache możemy znacznie odciążyć serwer. Regularne żądania do serwera dotyczące generowania i renderowania stron mogą nie być dobrym rozwiązaniem dla aplikacji jednostronicowych z bogatą funkcjonalnością. PHP posiada dobrze utrzymany ekosystem modułów. Świetnie sprawdza się przy rozwiązaniach integracyjnych w oparciu o kolejki np. rabbitMQ oraz Supervisor.

Przestarzały, klasyczny model klient-serwer, w którym każde żądanie inicjuje aplikacje, a co za tym idzie, za każdym razem nowe połączenie z bazą danych, pobranie parametrów konfiguracyjnych, renderowanie HTML. Przez to aplikacje w oparciu o PHP są wolniejsze względem Node.js.

Złoty środek nie istnieje

Polski rynek pracy wykazuje duże zapotrzebowanie na specjalistów w branży IT. Z własnych obserwacji wiem, że znacznie łatwiej przyjdzie nam znaleźć specjalistę PHP niż specjalistę Node.js. PHP posiada niski próg wejścia, co oznacza, że na rynku pracy znajdziemy więcej specjalistów PHP. W przypadku Node.js próg jest wyższy mimo wykorzystywania JavaScript. Nie każdy specjalista front-end będzie wstanie pisać kod po stronie back-end.

Musimy również uwzględnić różnice w kosztach zatrudnienia specjalisty, w przypadku Node.js, koszty będą większe, co wynika rosnącego zapotrzebowania na ekspertów.

Jak już zdążyłeś zauważyć, zarówno Node.js oraz PHP posiadają dobre i złe strony. Musimy przyjąć, że nie istnieje tutaj złoty środek, który rozwiąże wszystkie nasze problemy. Znajomość zakresu wymagań funkcjonalnych oraz technicznych jest podstawowym kryterium określenia architektury naszego projektu. Dobrze zaprojektowana, przemyślana architektura pozwoli odpowiedzieć, które z kluczowych jej elementów traktujemy jako “wąskie gardło” naszej aplikacji. Po tej analizie, powinniśmy być w stanie dopasować technologię do naszych potrzeb.


Zdjęcie główne artykułu pochodzi z unsplash.com.

Zapraszamy do dyskusji

Patronujemy

 
 
Polecamy
Jak przygotować się do kursu programowania. Pobierz workbook od SDA