您可以使用ZeroMQ解决此问题。
ZeroMQ 是一个库,它提供了用于将事物(线程、进程甚至单独的机器)连接在一起的增压套接字。
我假设您正在尝试将数据从服务器推送到客户端。好吧,一个很好的方法是使用EventSource API(可用的 polyfills)。
客户端.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]);
});
路由器.php
这是一个长时间运行的过程,它侦听传入的消息并将它们发送给任何收听的人。
<?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);
}
流.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 轻松地将 socket.io 连接到您的 PHP 代码。
也可以看看