1. HTML5 SSE(Server-Sent Events)
HTML5提供了SSE(Server-Sent Events)技术,可以通过建立一个长时间保持的HTTP连接,由服务端向客户端推送数据。这种方式使用简单,基于简单的HTTP协议,无需额外插件支持。
下面是一个基于PHP实现的SSE示例:
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('Connection: keep-alive');
while (true) {
$data = fetchDataFromDatabase();
$json = json_encode($data);
echo "data: $json\n\n";
flush();
sleep(1);
}
上述代码使用了header()
函数设置响应头,声明使用SSE。然后通过循环不断从数据库获取数据,将数据转化为JSON格式,并通过echo
输出到客户端。最后使用flush()
将数据立即发送到客户端。
优势:
1. 建立的是持久连接,可以实时推送数据。
2. 适用于较简单的消息推送场景,易于实现和使用。
3. 支持自定义事件类型,可以根据事件类型在客户端进行不同的处理。
注意事项:
1. 长时间保持的连接可能对服务器造成压力,需要合理调整推送频率。
2. 单个连接无法做到客户端与服务端的双向通信,只能由服务端主动推送消息给客户端。
2. WebSocket
WebSocket是一种基于TCP协议的全双工通信协议,能够让客户端与服务端建立实时的双向通信。PHP也可以通过WebSocket实现实时消息推送。
以下是一个使用Ratchet库实现WebSocket消息推送的示例:
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
require 'vendor/autoload.php';
class Pusher implements MessageComponentInterface {
protected $clients;
public function __construct() {
$this->clients = new \SplObjectStorage;
}
public function onOpen(ConnectionInterface $conn) {
$this->clients->attach($conn);
echo "New connection! ({$conn->resourceId})\n";
}
public function onMessage(ConnectionInterface $from, $msg) {
foreach ($this->clients as $client) {
if ($client !== $from) {
$client->send($msg);
}
}
}
public function onClose(ConnectionInterface $conn) {
$this->clients->detach($conn);
echo "Connection {$conn->resourceId} has disconnected\n";
}
public function onError(ConnectionInterface $conn, \Exception $e) {
echo "An error has occurred: {$e->getMessage()}\n";
$conn->close();
}
}
$server = \Ratchet\WebSocket\WsServer(new Pusher);
$server->run();
上述代码使用了Ratchet库,在服务器端创建了一个WebSocket服务,通过onOpen
、onMessage
、onClose
、onError
等方法处理连接和消息事件。当有新连接建立、收到消息、连接断开等事件发生时,可以在相应方法中处理逻辑。