Cercavate Node.js per PHP? Ecco a voi Swoole!

copertina articolo node.js per php
Alessio Periloso
Alessio PerilosoPHP Tech Lead

Credo che un’azienda innovatrice possa definirsi tale solo favorendo costantemente la crescita personale. Per quanto sia ovvio che un’azienda sia formata da persone, spesso dimentichiamo che sono proprio loro, i nostri colleghi e spesso amici, la chiave per la nostra stessa crescita.

Amo la condivisione delle conoscenze, ed è sempre un piacere offrire, così come ricevere da qualche collega – in questo caso anche amico – una nuova dritta da cui poter imparare qualcosa di nuovo: grazie mille come sempre, Paolo Libertini!

Quando scoprii Node.js, la prima cosa che cercai fu un framework semplice e simile a Laravel (sono un fanatico, è cosa nota, mi dispiace!). Pochi giorni fa, proprio grazie alla condivisione di Paolo, ho potuto terminare la mia ricerca: perché cercare Laravel per Node.js, quando Node.js stesso si è trasformato in Swoole?

Swoole è un framework di programmazione asimmetrica per PHP. Tecnicismi a parte, in pratica è un’estensione PHP scritta in linguaggio C, che ci consente di sviluppare servizi ad alte prestazioni, tramite socket e/o websocket, senza preoccuparci della complessità sottostante… proprio come fa Node.js.

Perché usare Laravel su Swoole?

I concetti che sono al di sotto di un sistema ad eventi ed un application server possono essere piuttosto complessi per un novizio, quindi iniziamo con il mostrare cosa accade quando chiediamo una pagina tramite il browser ad un server HTTP, che richiama uno script PHP (grazie a Simone Gentili per i preziosi suggerimenti su come semplificare il grafico).

Ogni volta che richiamiamo una pagina PHP, vengono inizializzati i moduli necessari, viene lanciato lo Zend Engine, il codice viene compilato in OpCode, vengono caricati tutti i files usati dal nostro framework, dopodiché finalmente il nostro codice viene eseguito. E questo accade, in linea di massima, per ogni singola richiesta.

Anziché continuare a fare e disfare, non sarebbe più utile tenere l’applicativo in memoria e farlo funzionare? I ragazzi di Java credo stiano ridendo. Quelli di Node.js, pure. Ed adesso ridiamo anche noi di PHP! 🙂

Swoole non fa altro che eliminare il superfluo. Il modulo sviluppato per Laravel ci consente di continuare ad usarne la fantastica sintassi, delegando al pacchetto tutta la gestione a basso livello del kernel (e della dependency injection). Ecco il perché della risata di poco fa!

Okay, ma cosa ci offre Swoole su Laravel?

  • Aumento delle prestazioni di circa il 300%
  • Supporto per l’esecuzione dei websocket direttamente su Laravel
  • Supporto nativo al protocollo socket.io
  • Supporto delle Swoole tables per la condivisione di dati tra processi
  • Tante altre piccole piccole cose che scoprirete usando

Installazione

Installiamo il modulo swoole PHP:

sudo pecl install swoole
sudo echo 'extension = swoole.so' > /etc/php/7.1/mods-available/swoole.ini
sudo ln -s /etc/php/7.0/mods-available/swoole.ini /etc/php/7.1/cli/conf.d/20-swoole.ini
sudo ln -s /etc/php/7.0/mods-available/swoole.ini /etc/php/7.1/fpm/conf.d/20-swoole.ini

Richiediamo il pacchetto che integra Laravel con Swoole tramite composer:

sudo wget -c https://getcomposer.org/composer.phar -O /usr/bin/composer
sudo chmod +x /usr/bin/composer
composer require swooletw/laravel-swoole

Se stiamo usando una versione di Laravel >= 5.5, abbiamo finito! (altrimenti ci basterà seguire il readme ed aggiungere il service provider)

Avviamo quindi il nostro server web basato su swoole:

php artisan swoole:http start

Starting swoole http server...
Swoole http server started: <http://https://www.linkedin.com/redir/invalid-link-page?url=127%2e0%2e0%2e1%3A1215>
Now you can access your Laravel application on http://https://www.linkedin.com/redir/invalid-link-page?url=127%2e0%2e0%2e1%3A1215.

E ora? Io amo i benchmark di successo!

Test con Laravel 5.5 ed il tradizionale nginx + PHP-fpm:

wrk -t4 -c100 http://your.app
Nginx with FPM
Running 10s test @ http://lumen.app:9999
  4 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.14s   191.03ms   1.40s    90.31%
    Req/Sec    22.65     10.65    50.00     65.31%
  815 requests in 10.07s, 223.65KB read
Requests/sec:     80.93
Transfer/sec:     22.21KB

Test con Laravel 5.5 ed il server web Swoole:

wrk -t4 -c100 http://your.app
Running 10s test @ http://https://www.linkedin.com/redir/invalid-link-page?url=127%2e0%2e0%2e1%3A1215
  4 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    11.58ms    4.74ms  68.73ms   81.63%
    Req/Sec     2.19k   357.43     2.90k    69.50%
  87879 requests in 10.08s, 15.67MB read
Requests/sec:   8717.00
Transfer/sec:      1.55MB

Conclusioni e approfondimenti

In linea di massima, questo è quanto. Vi sembra troppo semplice e volete qualche altra parola?

Okay… Quel che abbiamo fatto, è stato eliminare nginx e PHP-fpm, ed usare un application server completamente basato su PHP. Ovviamente, nulla ci vieta di continuare ad usare nginx per l’ssl, o per configurarlo come load balancer. E la nostra applicazione sarà (senza scrivere una sola riga di codice) velocissima 🙂

Per ulteriori informazioni, vi invito a consultare il pacchetto ufficiale su GitHub e la documentazione ufficiale!

2018-06-27T10:07:31+00:00