È possibile risolvere questo problema utilizzando ZeroMQ.
ZeroMQ è una libreria che fornisce socket sovralimentati per collegare le cose (thread, processi e persino macchine separate) insieme.
Suppongo che tu stia cercando di inviare dati dal server al client. Bene, un buon modo per farlo è usare lo EventSource API (polyfills available).
Client.js
Si collega al stream.php attraverso EventSource.
var stream = new EventSource('stream.php');
stream.addEventListener('debug', function (event) {
var data = JSON.parse(event.data);
console.log([event.type, data]);
});
stream.addEventListener('message', function (event) {
var data = JSON.parse(event.data);
console.log([event.type, data]);
});
router.php
Si tratta di un processo di lunga durata che ascolta i messaggi in arrivo e li invia a chiunque di ascolto.
<?php
$context = new ZMQContext();
$pull = $context->getSocket(ZMQ::SOCKET_PULL);
$pull->bind("tcp://*:5555");
$pub = $context->getSocket(ZMQ::SOCKET_PUB);
$pub->bind("tcp://*:5556");
while (true) {
$msg = $pull->recv();
echo "publishing received message $msg\n";
$pub->send($msg);
}
stream.php
Ogni utente che si collega al sito ottiene la sua propria stream.php. Questo script è di lunga durata e attende qualsiasi messaggio dal router. Una volta ricevuto un nuovo messaggio, questo messaggio verrà emesso nel formato EventSource.
<?php
$context = new ZMQContext();
$sock = $context->getSocket(ZMQ::SOCKET_SUB);
$sock->setSockOpt(ZMQ::SOCKOPT_SUBSCRIBE, "");
$sock->connect("tcp://127.0.0.1:5556");
set_time_limit(0);
ini_set('memory_limit', '512M');
header("Content-Type: text/event-stream");
header("Cache-Control: no-cache");
while (true) {
$msg = $sock->recv();
$event = json_decode($msg, true);
if (isset($event['type'])) {
echo "event: {$event['type']}\n";
}
$data = json_encode($event['data']);
echo "data: $data\n\n";
ob_flush();
flush();
}
per inviare messaggi a tutti gli utenti, basta inviare al router. Il router distribuirà quindi quel messaggio a tutti i flussi di ascolto. Ecco un esempio:
Questo dovrebbe dimostrare che non è necessario che node.js esegua la programmazione in tempo reale. PHP può gestirlo bene.
Oltre a ciò, socket.io è un modo davvero piacevole per farlo. E potresti facilmente connetterti a socket.io al tuo codice PHP via ZeroMQ.
Vedi anche
Cosa stai cercando di ottenere? Il metodo usuale consiste nel richiedere al client di chiamare periodicamente lo script per verificare le modifiche. C'è qualche ragione per cui vuoi farlo lato server? – JJJ
PHP non è proprio un linguaggio da usare per COMET. Usa il nodo.js o qualcos'altro che funziona in modo asincrono (ad esempio ciclone tornado o greenlet). Utilizzando PHP in esecuzione su un server web basato su thread/processo, si ha un enorme sovraccarico. – ThiefMaster
@Juhana, il motivo è quello di evitare la verifica periodica del cambiamento e di avere una soluzione 'reverse-ajax'. @thiefMaster so che ci sono alcune soluzioni COMET server là fuori, ma penso davvero che un back-end di PHP possa essere possibile, e finché scriverò il mio login business in PHP sarebbe molto meglio non riscrivere in un'altra lingua evitando il codice duplicazione. Puoi spiegarmi perché un backend comet di PHP sarebbe quello in testa? – ArtoAle