Prima di addentrarci nella "battaglia" tra NodeJS e PHP dobbiamo capire perché la questione è tutt'ora in corso. Tutto è iniziato con l'incremento della domanda di applicazioni per smartphone, il loro successo ha forzato gli sviluppatori ad adattarsi a nuove tecnologie back end che potessero gestire una moltitudine di richieste simultanee.
JavaScript è stato sempre individuato come strumento client side, per gestire compiti e operazioni lato server, invece, abbiamo spesso optato per PHP. La comparsa di NodeJS ha però sovvertito le cose, consentendo di utilizzare JavaScript per fare ciò che prima era possibile solo con un sistema basato su più tecnologie.
Sebbene sia PHP che NodeJS possono gestire applicazioni di qualsiasi grado di difficoltà, sono due tecnologie differenti costruite su architetture altrettanto diverse. NodeJS non è un linguaggio, ma un ambiente di runtime che permette utilizzare JavaScript per lo sviluppo di applicazioni server side. Lanciato nel 2009, ha già ampiamente dimostrato il potere di JavaScript quando è utilizzato per applicazioni di nuova generazione basate sugli eventi.
Vantaggi di NodeJS
Gestione del flusso di Input/Output
NodeJS sfrutta il ciclo di eventi proprio di Javascript per produrre applicazioni con flusso Input/Output ininterrotto, che può facilmente "gestire" più eventi simultanei. Sfruttando il sistema asincrono di proprietà di Javascript è possibile realizzare soluzioni server-side fortemente scalabili che massimizzano sia l'utilizzo di una singola CPU sia della memoria mentre vengono gestite molte più richieste rispetto ai comuni server multithread (in grado di gestire più processi contemporaneamente).
Questa caratteristica fa di NodeJS un'ottima scelta per la realizzazione di applicazioni asincrone, data-driven il cui flusso Input/Output viene messo a dura prova, come le applicazioni in tempo reale (RTA - Real Time Applications) e le applicazioni a pagina singola (SPA - Single Page Applications), dove questa tecnologia assicura una performance a runtime a dir poco eccellente.
Un solo linguaggio, compiti differenti
I framework client-side di nuova generazione, come React, Angular ed Ember, sono scritti interamente in Javascript, che è il linguaggio di scripting principale dei browser moderni. Utilizzando NodeJS in combinazione con questi prodotti, si avranno tutti i benefici derivanti dall'utilizzo di un unico linguaggio nello stack dell'applicazione Web. Utilizzare lo stesso linguaggio sia lato client che lato server è eccellente per la mantenibilità dell'applicazione e per la sua gestione da parte di un team, perché i gruppi di produzione frontend e backend lavorano con le stesse strutture Javascript, dati, funzioni, espressioni idiomatiche e convenzione di scrittura.
Tutto ciò contribuisce ad uno sviluppo più rapido, ad un bug-fixing più efficace e ad una coordinazione migliorata tra i team di sviluppatori.
Flessibilità
NodeJS ha poche dipendenze, regole o linee-guida rigide, il che lascia spazio alla libertà ed alla creatività dello sviluppatore per produrre applicazioni Web di nuova generazione. Gli sviluppatori di NodeJS saranno maggiormente liberi di scegliere l'architettura di sviluppo che ritengono migliore, cosi come i design pattern, i moduli e le caratteristiche tecniche di produzione.
Svantaggi di NodeJS
Attenzione alla CPU
NodeJS, in quanto ambiente basato sugli eventi e single-threaded, risulta essere meno efficiente nella gestione di applicazioni che sfruttano intensivamente la CPU, come quelle che devono generare o modificare grafica, audio, video. Nel caso in cui un'applicazione NodeJS deve processare file molto grandi o gestire operazioni grafiche infatti, questa potrebbe diventare non-responsiva e lenta.
Per applicazioni che gestiscono la grafica, un ambiente server multi-threaded risulta essere una scelta migliore rispetto a NodeJS.
Estensioni non completamente mature
Oltre alle librarie del Core, come HTTP e Crypto, NodeJS possiede un repository che fornisce un accesso ad una moltitudine di moduli sviluppati da terze parte e disponibili per l'intera community. Tuttavia, questa collezione di moduli è ancora "immatura", dato che è ancora difficile accertarsi della qualità di un particolare modulo prima della distribuzione dell'applicazione che ne fa uso.
Inoltre, alcuni bug subdoli e problemi di compatibilità con le differenti versioni potrebbero infiltrarsi nelle applicazioni rendendone difficile la manutenzione. La mancanza di un meccanismo di controllo dei moduli prodotti da terze parti si traduce in un'attenzione maggiore da parte dello sviluppatore nella scelta dei moduli stessi, rendendo necessario un controllo accurato sull'attività di sviluppo relativa al modulo stesso, comprensiva di bug-fixing e aggiornamenti.
Vantaggi di PHP
Prodotti di terze parti
PHP è stato utilizzato per produrre piattaforme utili allo sviluppo di applicazioni Web di indubbia qualità, come WordPress, Joomla e Drupal, che sono impiegati estensivamente da milioni di sviluppatori nel Mondo e che godono di aggiornamenti e bug-fixing costanti. Non solo questi strumenti possono essere usati da sviluppatori più o meno esperti, ma anche da utenti che non sono sviluppatori: WordPress, ad esempio, prevede una procedura guidata che permette a qualsiasi utente di installarlo senza problemi. Se questo non bastasse, molti server e servizi di hosting offrono preinstallazioni di WordPress, Joomla e Drupal.
Oltre ai CMS dedicati a tutti, PHP è alla base di framework di sviluppo dedicati appositamente agli addetti ai lavori, come ad esempio Laravel, Symfony, Zend Framework e Code Igniter, che permettono sia di ridurre in modo drastico la scrittura di codice, sia di utilizzare design pattern all'avanguardia.
La community di PHP è veramente molto ampia, e qualsiasi strumento uno sviluppatore stia cercando, può essere sicuro di trovarlo.
Portabilità assoluta
PHP è una soluzione portabile: può girare su quasi tutti i server (Apache, Nginx..) e piattaforme. Allo stesso modo, PHP gode di un supporto di hosting enorme, tanto che moltissimi providers offrono opzioni di specifiche. NodeJS richiede invece un server virtuale con accesso ad SSH per lanciare le applicazioni. L'integrazione di PHP e la distribuzione di applicativi PHP potrebbe dunque essere una scelta più semplice per sviluppatori che non hanno un'ottima conoscenza di strumenti quali la riga di comando e le tecnologie server Linux che sono invece la scelta migliore per lavorare con NodeJS.
Orientato al Web
A differenza di linguaggi di programmazione quali Java e Python, che possiedono uno scopo generale ed ampio, PHP è stato elaborato specificamente per lavorare con il Web. Per questo motivo, include praticamente tutte le funzionalità richieste per gestire il linguaggio HTML, l'interazione con server, client e file e la connessione/gestione dei database. La potenza "lato server" di PHP permette di alleggerire il carico di lavoro del client, e questa è un'ottima caratteristica per determinati tipi di applicazioni.
Tuttavia il carico di lavoro che grava sul server non è una buona opzione per altrettanti tipi di applicazioni, come le RTA e le SPA, nelle quali vengono prodotte richieste frequenti e regolari al server, dove dunque una funzionalità client-side più ricca, gestita in un unico flusso rappresenta un'opzione migliore.
Svantaggi di PHP
Separazione dei compiti insufficiente
Il paradigma SoC (Separation of Concers o separazione dei compiti/preoccupazioni) è un principio di progettazione che mira a dividere un sistema in moduli distinti, in modo tale che ogni modulo gestisca un certo compito. Il design pattern Model-View-Controller (MVC), che prescrive una separazione dei compiti all'interno di un unico sistema, è per esempio una rappresentazione concreta del principio SoC.
MVC assicura leggibilità, manutenibilità e scalabilità delle applicazioni Web. Sebbene quasi tutti i framework PHP siano ampiamente basati su MVC, PHP stesso non è l'ambiente migliore per la SoC, data la sua naturale tendenza a mischiare scripting e HTML/CSS/Javascript negli stessi file. Senza una netta e concreta separazione tra logica e contenuto PHP non è ideale per realizzare applicazioni SoC.
Modello Client-Server antiquato
PHP segue il modello di interazione tra client e server "classico", in cui ogni richiesta alla pagina inizializza l'applicazione, la connessione al database, i parametri di configurazione ed il rendering HTML.
Questo modello rende PHP più lento rispetto a NodeJS, in cui le applicazioni girano senza interruzioni e necessitano di un'unica inizializzazione. A causa di questa caratteristica, NodeJS risulta essere una scelta più idonea ed appropriata per lo sviluppo di applicazioni moderne che sfruttano a le potenzialità dell'HTML 5, AJAX (Asynchronous Javascript And XML) e dei Web Socket.
PHP, attraverso Memchaded (un sistema generico di gestione della cache), può gestire questa problematica per velocizzare l'interazione con i database attraverso il caching di dati ed oggetti nella RAM, in modo da ridurre il numero di volte in cui un sistema esterno viene gestito, ma questa caratteristica non è una feature standard del linguaggio PHP.
Quale scegliere tra NodeJS e PHP?
La scelta tra un ambiente e l'altro non è basata in questo caso su quale sia il migliore, ma sul tipo di progetto da realizzare. La scelta dipende dalla conoscenza delle architetture di entrambi gli ambienti di sviluppo presentati. Ad esempio, per la creazione di applicazioni in tempo reale, come quelle di messaggistica istantanea o di collaborazione condivisa, dove il numero di richieste contemporanee è concretamente alto e dove lo scambio di informazioni tra client e server è massiccio, NodeJS ha il sopravvento.
Esistono dei boost per i framework PHP che permettono di gestire richieste simultanee, ma sono appunto boost, a differenza di NodeJS dove l'ecosistema permette di gestire un'infrastruttura basata sugli eventi in cui il flusso di Input/Output gira ininterrottamente. Il supporto da parte di NodeJS agli eventi lato server e dei Web Sockets lo rende una scelta ideale per applicazioni che processano i dati dall'IoT (Internet of Things) e per le SPA che comportano un lavoro massiccio lato client, cosi come per i Web services, dove le funzionalità lato server come le API REST forniscono una connessione client/database e la velocità di operazioni CRUD e processi asincroni è di estrema importanza.
Contrariamente, PHP è una scelta ottimale per lo sviluppo di applicazioni "classiche" (blog, portali Web, e-commerce..). Con tutti i CMS scritti in PHP è semplice creare queste applicazioni e renderle dinamiche senza aggiungere molte righe di codice. PHP, come detto, possiede intrinsecamente anche un supporto hosting praticamente immenso. Se necessiti di un hosting condiviso al posto di, ad esempio, un cloud virtuale, PHP fornisce una maggiore flessibilità nell'integrazione e nella distribuzione delle applicazioni.