La prima cosa da capire è che uno non è “generalmente” migliore dell’altro. Tutto dipende dalle proprie esigenze.
Vediamo i pro e i contro dell’uno e dell’altro in 6 punti:

1. Apache generalmente usa PHP come linguaggio di scripting, che è estremamente facile come linguaggio ed è nato per il web. Node.js invece si basa sul motore javascript v8 (ripreso da chrome) inizialmente non concepito per lavorare nel back-end.

2. Apache e PHP sono vecchi e stabili. Tutto ciò che vorresti realizzare probabilmente è già disponibile in rete con tonnellate di guide e gente pronta a fornire supporto. Node.js è il nuovo arrivato. Molti CMS famosi e framework di sviluppo sono stati scritti in PHP (WordPress, Drupal, Joomla, e poi Laravel, Code ignitor, cake PHP). Questi framework son molto utili per organizzare il codice di grosse applicazioni. Node.js ha pure dei framework, come Express e Sails.js, ma sono ancora nuovi e poco documentati se confrontati ai framework PHP.

3. Apache è basato su thread e processi. Ogni richiesta è gestita da un thread separato in un processo. Ciò significa che se un processo aspetta il risultato di una una lettura/scrittura (I/O), tutti i thread son di fatto bloccati. Node.js invece ha un I/O asincrono e basato ad eventi. Ogni istanza di node.js gira in un processo separato e grazie alla natura asincrona è dunque in grado di gestire un numero di gran lunga maggiore di richieste concorrenti.

4. Apache è basato sui thread, se si verifica un problema durante l’elaborazione di una richiesta, solo quel thread crasha, mantenendo attivi gli altri thread e dunque le altre richieste. Node.js con un singolo processo gestisce più richieste. Se si verifica un problema, l’intera istanza di Node.js crasha con la perdita di tutti i dati salvati negli oggetti. Può ovviamente essere riavviato il processo, ma i dati temporaneamente salvati nelle strutture dati del linguaggio vengono persi.

5. Quando Apache elabora una richiesta CPU-intensive, le altre richieste non vengono bloccate per via del context switching fra thread.

6. Quando Node.js elabora una richiesta CPU-intensive, tutte le richieste vengono bloccate finchè questa richiesta CPU-intensive non richiede qualche I/O. E’ dunque una buona idea in questi casi delegare questi calcoli a processi separati (workers).

7. PHP non supporta nativamente i web socket. Ci sono delle librerie che possono aiutare nell’implementazione, ma ancora, per via del modello basato sui thread, un numero esiguo di connessioni web socket attive può consumare tutte le risorse del server. NodeJS è un candidato perfetto per la comunicazione real-time su internet. Combinato con Socket.io si riesce ad ottenere un server web socket scalabile con mezzi di comunicazione di fallback come i flash socket o il long polling. E’ leggero e facilmente scalabile perchè tutto gira in un singolo processo.