2013-05-10 14 views
7

Ho un'app PHP sviluppata e in esecuzione su Apache, che usa Nginx come proxy inverso per servire risorse statiche.Uso di Redis per comunicare tra PHP e socket.io/node.js

Ho anche installato Redis che sto usando per memorizzare gli ID delle attività per ogni flusso di attività degli utenti. L'attività viene scritta su un database MySQL, quindi Redis trasferisce l'ID attività in ogni flusso di utenti. Quando un utente riceve il suo flusso di attività, l'app recupera prima l'elenco degli utenti di ID attività da Redis e quindi ottiene i dati di attività effettivi tramite una query MySQL IN().

Questo funziona tutto molto bene, tuttavia voglio iniziare ad aggiungere funzionalità in tempo reale a questa configurazione. Mi piacerebbe essere in grado di trasmettere questi eventi direttamente al browser di un utente e aggiungere anche notifiche generali dal vivo.

Per questo ho installato node.js con socket.io. Ho il server socket.io correttamente attivo e funzionante e un client è automaticamente connesso al caricamento della pagina.

Dove sto lottando è capire come inviare un messaggio a socket.io dall'interno della mia app PHP. Dal momento che PHP e node.js non possono comunicare direttamente, la mia comprensione è che sarebbe meglio utilizzare Redis come intermediario poiché l'ho già installato e installato e funzionante. Tuttavia non ho idea di come andare su questo.

Ciò di cui ho bisogno è una descrizione del processo (qualsiasi esempio di codice sarebbe molto utile) di inviare una notifica da PHP a Redis e poi in socket.io per poter essere inviata al client pertinente.

Inoltre, non capisco come socket.io possa sapere a quale client inviare. Come posso passare queste informazioni e mantenere tutto sincronizzato? E 'anche necessario? Devo memorizzare le mie sessioni PHP in Redis e avere socket.io raccogliere i dati quando un utente si connette? oppure c'è un'altro modo?

Grazie in anticipo.

Nota: I miei dati SESSION PHP sono attualmente salvati su disco.

+0

come di avere un canale PubSub su Redis, e la sottoscrizione ad esso dal vostro processo node.js. Il PHP quindi pubblicherebbe su pubsub per comunicare al nodo. puoi avere canali pubub separati per diversi clienti e pubblicare su qualunque canale tu abbia bisogno per raggiungere i tuoi clienti specifici. – akonsu

+0

@akonsu Questo è esattamente ciò che ho fatto grazie. Tuttavia, ho impostato solo un singolo canale Pubub e ho pubblicato tutto per farlo entrare in socket.io. Lì lavoro su quale client specifico dovrebbe andare in ecc ... Sarebbe meglio definire un canale pubub separato per ogni client connesso? Inoltre, se vuoi scriverlo più in dettaglio come risposta, lo segnerò correttamente. :) – gordyr

+0

Onestamente, non so se creare un canale separato per ogni utente.Dipende dal numero di utenti. Potrebbe non scalare. Ma sicuramente terrei presente la possibilità di avere diversi canali. Un giorno quando la tua base di utenti cresce, potresti avere un numero di istanze redis correlate e condividere i tuoi canali con loro. – akonsu

risposta

1

È possibile impostare un canale pubsub su Redis (vedere http://redis.io/topics/pubsub). Quindi iscriviti ad esso dal tuo processo node.js. Il PHP quindi pubblicherebbe su pubsub per comunicare al nodo. Puoi avere canali Pubub separati per diversi clienti e pubblicare su qualunque canale tu abbia bisogno per raggiungere i tuoi clienti specifici.

+2

Si prega di allegare un link sorgente per renderlo più chiaro ... – tong

+0

grazie. Aggiunto un link. – akonsu

0

Redis non offre websocket o server http incorporato, pertanto è necessario integrarlo con php o node.js per eseguire lo streaming dei dati dei canali. con il metodo Tweak, possiamo collegare Redis server con php usando la libreria predis php per redis, dove php sposterà i dati in Redis e socket.io terrà traccia dei nuovi messaggi spinti in Redis sever e li ritrasmetterà agli utenti ad esso connessi in real tempo.

https://github.com/u-day/tweak/