WebSocket Php #1

Non mi concentravo cosi tanto su social art da parecchio tempo, ed ora rispetto a 2 anni fa ho imparato che veramente fatto è meglio che perfetto. e sto procedendo velocemente.
2 anni fa non avrei mai accettato di partire con un pocket php solo perché non sapevo farlo in node. sarei rimasto a sbattere la testa per imparare una cosa nuova e farlo bene al primo colpo.
ora mi rendo conto che in ogni caso è meglio arrivare a mostrare qualcosa, piuttosto che non finire mai.
non vedo l’ora di mettere online una versione multiutente :D

è un po incasinato il socket php, ma direi che ne posso uscire facilmente.
ora ho il problema che non funziona più il riconoscere la deconnessione di un client, quindi ho un array di client a cui scrivere più altro del normale, e mi aspetto risposte che non arrivano.

comunque salvo nel db mysql via socket il base64 dell’immagine png e restituisco al client che me lo ha inviato l’id generato nel db.
per completare il salvataggio devo anche inviare quel nuovo disegno a tutti i client che sono nelle sue stesse coordinate.

ora devo fare il drag… significa che su ogni drag devo pushare le coordinate attuali, e lato server farmi un dizionario di client e relative coordinate. aggiornarle su ogni push dei client, ed eliminarli quando si disconnettono. e ad ogni push inviare il son di immagini.

purtroppo qui viene fuori il limite di php, che non è asincrono per natura come node.
il socket funziona grazie un while true…. ed ho detto tutto. quindi se faccio un drag, e devo inviare 10 disegni in json, potrebbe arrivarmi un’altro push per il drag successivo prima di aver finito la trasmissione dei dati del drag precedente. e non credo ci sia un modo per identificare il drag successivo e interrompere il precedente, visto che è tutto sincrono. in più il tempo di attesa tra la risposta di un drag e del successivo si somma per ogni client in parallelo….

la logica è :

while true
– prendi array di client connessi
– per ogni client guarda se c’è un messaggio
– se il messaggio è un disegno da salvare, lo salvo, e per ogni client connesso verifico le coordinate ed eventualmente lo invio
– se il messaggio è di tipo drag, aggiorno le coordinate, query sul db e invio il json di disegni (che può essere molto pesante….)

se ho 100 client connessi che esplorano la lavagna, rispondo ad uno alla volta. e un client che fa due drag di fila si beccherà due risposte, anche se la prima non serve piû a un cazzo, e per attendere la seconda (quella buona) dovrà aspettare che abbia risposto una volta a tutti gli altri 99 socket.

senza contare poi che php gira su un solo thread, quindi avere while true ti porta un core al 100% e ignora completamente tutti gli altri, usando solo una piccola parte della potenza di calcolo di un server.
quindi per far girare questo backend in php piuttosto che node, a parità di prestazioni bisogna spendere più soldi il server su netsons… per prendere più potenza di calcolo.

e non ho ancora idea di cosa accada se tra un ciclo e l’altro del while, lo stesso client ha mandato più di un messaggio… test ancora da fare

Lascia un commento