dal 2015 - visita n. 4011
php socket intro
php socket intro

 

Server Live

Nella sezione precedente abbiamo visto che bisogna mantenere il nostro server attivo non-stop. Il modo più semplice per ottenerlo è quello di mettere la funzione socket_accept in un ciclo senza fine in modo che possa continuamente ricevere le connessioni in arrivo.

In questo modo il server rimarrà sempre Live, cioè attivo. Ecco come modificare semplicemente il codice precedente:


Non abbiamo fatto molto lavoro, è stato sufficiente mettere la funzione socket_accept in un loop, togliere l'istruzione socket_close($sock) e fare qualche altro piccolo ritocco.

L'introduzione della riga error_reporting(~E_NOTICE); serve solo per evitare la segnalazione di errori banali e messaggi correlati poco significativi che potrebbero infastidire la comunicazione tra client e server.


Esecuzione dello script

Dopo aver salvato il codice precedente nella cartella public_html dandogli il nome socket04.php, lo possiamo mandare in esecuzione, come al solito, direttamente dalla riga di comando di un terminale:

$ php ~/public_html/socket04.php

Omettiamo per brevità la messaggistica di uscita, già vista in precedenza, ed apriamo in successione 3 altri terminali avviando in ognuno di essi il comando:

$ telnet localhost 5000

e poi da ognuno di essi inviamo un diverso messaggio.

Adesso, tenendo d'occhio il terminale del server, osserviamo attentamente le sequenze dei messaggi di avvenuta connessione e di disconnessione dei client man mano che vengono serviti. Possiamo notare che ciascun client viene servito in ordine cronologico di arrivo e che il server passa al client successivo solo quando ha concluso le operazioni con l'avvenuta disconnessione del precedente client servito. Cioè i client vengono serviti in ordine cronologico di arrivo. Fare molta attenzione, per questo motivo, ai codici di identificazione assegnati dal server a ciascun client in lavorazione.

Su ciascuno dei terminali telnet, alla fine, apparirà qualcosa del genere:

Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Ciao da terminale 2 
OK ... Ciao da terminale 2
Connection closed by foreign host.
$

Da notare la ricomparsa del prompt che indica, oltre l'avvenuta disconnessione, la disponibilità del terminale per altre operazioni.

Mentre, dopo la lavorazione di 3 terminali telnet, sul server ci sarà qualcosa del tipo:

Socket creato correttamente. 
Bind del socket OK 
Ascolto del socket OK. 
In attesa dell'arrivo delle connessioni... 
Client 127.0.0.1 : 57591 risulta collegato. 
Client 127.0.0.1 : 57591 servito e scollegato. 
Client 127.0.0.1 : 57593 risulta collegato. 
Client 127.0.0.1 : 57593 servito e scollegato. 
Client 127.0.0.1 : 57595 risulta collegato. 
Client 127.0.0.1 : 57595 servito e scollegato. 

e niente prompt ad indicare che la sua attività è ancora in corso.

Il funzionamento del tutto sembra abbastanza interessante, ma in effetti la gestione cronologica non è molto pratica se considerata dalla parte dei client che si trovano inseriti in una coda di lavoro dalla quale non possono assolutamente sfuggire. Vediamo allora di migliorare la situazione con una gestione più interattiva, che possiamo definire asincrona, cioè slegata dalla cronologia d'arrivo.


Gestione delle connessioni in polling

Per gestire ogni connessione in modo indipendente sarebbe necessario far girare un blocco di codice separato per ciascuna delle connessioni accettate dal server. Un modo elegante per raggiungere questo obiettivo sarebbe quello di usare la metodologia dei thread. Il programma principale del server accetta una connessione e crea un nuovo thread per gestire la comunicazione per quel collegamento, quindi torna ad accettare altre connessioni. Purtroppo questa metodica non è immediatamente trasferibile al PHP se non con luso di apposite librerie di estensioni.

Un altro metodo è quello di utilizzare una funzione di selezione. Questa funzione di selezione sostanzialmente interroga ciclicamente (polling) lo stato di un gruppo di socket per verificare se accadono determinati eventi: lettura, scrittura, problemi, etc.

La figura seguente illustra le modifiche logiche che si rendono necessarie per gestire gli ascolti del server in modalità polling.



Server TCP in polling

Nel nostro caso, la funzione di selezione, socket_select, può essere utilizzata per monitorare più client e verificare quando il client invia un messaggio.

Esecuzione dello script

Dopo aver salvato il codice precedente nella cartella public_html dandogli il nome socket05.php, lo possiamo mandare in esecuzione, come al solito, direttamente dalla riga di comando di un terminale:

$ php ~/public_html/socket05.php

Omettiamo per brevità la messaggistica di uscita, già vista in precedenza, ed apriamo in successione 3 altri terminali avviando in ognuno di essi il comando:

$ telnet localhost 5000

e poi da ognuno di essi inviamo diversi messaggio. Adesso il comportamento complessivo è migliorato:

Ecco una tipica schermata durante la lavorazione con 3 terminali telnet attivi:

Socket creato correttamente. 
Bind del socket OK. 
Ascolto del socket OK. 
In attesa dell'arrivo delle connessioni... 
Client 127.0.0.1 : 48865 risulta collegato. 
Client 127.0.0.1 : 48867 risulta collegato. 
Client 127.0.0.1 : 48867 risposta inviata. 
Client 127.0.0.1 : 48867 risposta inviata. 
Client 127.0.0.1 : 48865 risposta inviata. 
Client 127.0.0.1 : 48869 risulta collegato. 

Quest'ultimo script php che abbiamo costruito fornisce un servizio essenziale, praticamente istantaneo, alle richieste dei client che si sono collegati e lascia a questi ultimi la facoltà di decidere anche la disconnessione. Questo potrebbe costituire la base di partenza per realizzare qualcosa di più utile.


Punto della situazione

In questa sezione abbiamo imparato come:


















Menù
Introduzione
Ambiente di sviluppo
intro php-01
tag e commenti php-02
variabili e tipi php-03
operatori php-04
php IF esercizi
php FOR esercizi
php objects intro
php objects parte 1
php objects parte 2
php objects parte 3
php objects parte 4
php objects parte 5
CLIL
php socket intro
php socket parte 1
php socket parte 2
php socket parte 3
php socket parte 4
php socket parte 5
php socket parte 6
php socket extra
linux netcat


MiniGuida PHP
Guida Ufficiale PHP (en)
Form Base
Flat DataBase
Pagine Protette
mySQL



Per quanto malvagi siano gli uomini, non oserebbero sembrare nemici della virtù: quando la vogliono perseguitare, fingono di credere che sia falsa oppure le attribuiscono dei crimini.
François de La Rochefoucauld

Valid CSS!
pagina generata in 0.004 secondi