您可以使用ZeroMQ解決此問題。
ZeroMQ是一個庫,它提供超級充電插座,用於將事物(線程,進程甚至獨立機器)連接在一起。
我假設你試圖將數據從服務器推送到客戶端。那麼,一個好方法就是使用EventSource API(polyfills available)。
client.js
通過連接到的EventSource stream.php。
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
這是一個長期運行的進程偵聽傳入的消息,並將其發送出去給任何人聽。
stream.php
連接到網站的每個用戶得到他自己的stream.php。該腳本長時間運行並等待來自路由器的任何消息。一旦獲得新消息,它將以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();
}
要發送消息給所有用戶,只需將它們發送到路由器。路由器然後將該消息分發給所有收聽的流。這裏有一個例子:
<?php
$context = new ZMQContext();
$sock = $context->getSocket(ZMQ::SOCKET_PUSH);
$sock->connect("tcp://127.0.0.1:5555");
$msg = json_encode(array('type' => 'debug', 'data' => array('foo', 'bar', 'baz')));
$sock->send($msg);
$msg = json_encode(array('data' => array('foo', 'bar', 'baz')));
$sock->send($msg);
這應該證明你不需要node.js來做實時編程。 PHP可以很好地處理它。
除此之外,socket.io是一個很好的方法。你可以很容易地通過ZeroMQ連接到你的PHP代碼。
也
你想達到什麼目的?通常的方法是讓客戶端定期調用腳本來檢查更改。爲什麼你想要在服務器端做到這一點有什麼原因嗎? – JJJ
PHP實際上不是您應該用於COMET的語言。使用節點。js或其他異步工作的東西(例如python龍捲風或greenlet)。通過使用運行在基於線程/進程的web服務器上的PHP,您有很大的開銷。 – ThiefMaster
@Juhana,原因是爲了避免定期檢查變化並制定「反向ajax」解決方案。 @thiefMaster我知道那裏有一些COMET服務器解決方案,但我真的認爲php後端是可能的,只要我用PHP寫企業登錄,最好不要用另一種避免代碼的語言重寫複製。你能解釋一下爲什麼一個PHP彗星後端會造成重頭戲嗎? – ArtoAle