[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [linux_var] Trigger javascript-php



Il 21-11-16, 14:15, Salvatore Racano <salvatoreracano@gmail.com> ha scritto:
>    puoi provare con la tecnica chiamata Ajax long polling.

attento a non accumulare troppe richieste ajax in sospeso e per
troppo tempo: per scelta "politica" i browser stabiliscono dei
limiti compresi fra 4 e 8. Firefox, per esempio, impone per
default un limite di 6 richieste ajax per volta, limite che puoi
modificare (about:config -->
"network.http.max-persistent-connections-per-server")
Un altro limite del long polling è dato dalla durata della
persistenza, dal timeout imposto dal browser (su firefox è
modicabile da about:config --> "network.http.response.timeout"
attualmente preimpostato a 300 secondi == 5 minuti)

ti ho suggerito questi due limiti perché, non conoscendoli prima, mi
sono trovato di recente a dover rifare un programma server-client,
peraltro peggiorandolo in prestazioni e semplicità (può essere
più efficiente un programma con 40 richieste parallele in sospeso
di uno che ne gestisce una sola per 40 operazioni in sequenza
solo per aggiornare uno solo dei 40 dati...)

>    2016-11-21 14:08 GMT+01:00 Giovanni Orlandi <[1]orlangio@gmail.com>:
>      >> Un'altra ottimizzazione sarebbe mettere un ciclo dentro al php
>      con
>      >> delle sleep in modo che mi faccia lui il controllo ogni decimo di
>      >> secondo
>      >> per diciamo un centinaio di volte in modo da avere una richiesta
>      ogni
>      >> 10 secondi per singolo client.

per questa ottimizzazione è davvero necessario usare un modello a
cicli temporizzati? È un po' che non programmo in php e non
conosco la tua situazione, ma -almeno in linea teorica- c'è anche
un'altra possibilità: 
sempre con il long polling, il client dice al server di essere
disponibile a ricevere un dato, effettuando la sua richiesta
ajax, poi il server -senza entrare in loop con attese- risponde
solo quando c'è la novità. Come? Con un modello "a
interruttori". Non so quanto sia fattibile in php.
Di recente ho scritto un programma server http in bash (dovevo
importare una serie di funzioni bash...), avviato
con socat:
socat TCP-LISTEN:$PORT,fork,reuseaddr EXEC:server.sh

all'interno di server.sh c'è un ciclo "while read" che verifica
le richieste ajax e risponde, servendo tutto ciò
che serve per un sito web, con metodi GET e anche POST. Per
creare gli "interruttori" ho scritto due funzioni del tipo:
1) lock_fifo $SUFFIX
2) unlock_fifo $SUFFIX

dopo aver ricevuto la richiesta ajax da lasciare in sospeso, il
server stesso si mette in sospeso con la 1: crea un fifo e si mette
in ascolto con un "read < fifo-$SUFFIX"

se il server riceve una richiesta (ajax oppure no) di modifica di
un dato, il processo server che modifica il dato lato-server usa
anche la funzione 2, che sblocca il fifo-$SUFFIX scrivendoci
dentro qualcosa (se non serve trasmettere dati, basta un "echo >
fifo-$SUFFIX"). A quel punto, tutti i "read" in attesa di dati da
quel fifo (processi paralleli in socket diversi)
terminano l'attesa e il server continua a compiere le operazioni
previste, successive al "read < fifo...", per concludere le
richieste in sospeso. Automaticamente il client, ricevuti i nuovi
dati, reinvia la sua richiesta da lasciare in attesa sul
server. A rimanere in attesa non è solo il client ma anche il
server, in questo caso attraverso un fifo.
È più semplice da farsi che a spiegarlo (l'esempio dello script
bash dovrebbe valere come metaprogrammazione, come modello
pratico-teorico) 

Il vantaggio degli "interruttori" è ovvio: i cicli temporizzati
sono sempre in ritardo, perché rispondono NON quando c'è una
novità MA quando la rilevano, e impiegano risorse
aggiuntive. Sarebbe interessante sapere se con php è possibile
realizzare un modello simile. 


PS: l'esempio pratico è applicato anche in ZigzagDownLoader
(http://nongnu.org/zdl) che può avviare un'interfaccia via socket
attraverso nuove opzioni:
zdl --web-ui
zdl -s PORTA
zdl --socket=PORTA
zdl -s
zdl --socket
...varianti...

zdl -sd

(se non si vuole avviare il browser, per controllare zdl da
smartphone, consiglio di avviare anche il demone con -d,
--daemon. In ogni caso, dall'interfaccia web è possibile creare
nuovi socket attraverso altre porte: per un buon funzionamento,
ogni disposivo andrebbe connesso attraverso una porta diversa)

queste nuovissime opzioni non sono ancora documentate e
pubblicizzate e ve le sto dicendo in anteprima galattica :)

-- 
Z O N I N O Z
Gianluca Zoni

zoninoz@inventati.org
http://inventati.org/zoninoz
http://savannah.gnu.org/users/zoninoz
_______________________________________________
Talking mailing list
Talking@ml.linuxvar.it
http://ml.linuxvar.it/cgi-bin/mailman/listinfo/talking