web-msg-sender 是 workman 推出的一款 web 长连接推送框架,采用 PHPSocket.IO 开发,基于WebSocket 长连接通讯,如果浏览器不支持 WebSocket 则自动转用 comet 推送。 通过后台推送消息,消息可以即时推送到客户端,非轮询,实时性非常好,性能很高。
官方的示例非常简单,只推送了一句话,而我们在日常开发时,更多的需求是向前端推送一个数组。接下来本文就分享一下 web-msg-sender 发送数组的方法。
一、后台返回 json 数据。
public function handle(StudentRegistered $event)
{
// 指明给谁推送,为空表示向所有在线用户推送
$to_uid = "";
// 推送的url地址,使用你的服务器地址
$push_api_url = "http://127.0.0.1:2121/";
$post_data = array(
"type" => "publish",
"content" => $event->student->toJson(),
"to" => $to_uid,
);
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $push_api_url );
curl_setopt ( $ch, CURLOPT_POST, 1 );
curl_setopt ( $ch, CURLOPT_HEADER, 0 );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $post_data );
curl_setopt ($ch, CURLOPT_HTTPHEADER, array("Expect:"));
$return = curl_exec ( $ch );
curl_close ( $ch );
var_export($return);
}
这里之所以转成 json 格式,而不是 array 是因为在 curl post 时,参数为二维数组会提示Array to string conversion 错误。
二、修改 web-msg-sender 关闭 htmlspecialchars
。
找到 web-msg-sender 根目录,打开 start_io.php 文件,将:
$post['content'] = htmlspecialchars(@$post['content']);
修改为:
$post['content'] = @$post['content'];
如果不关闭 htmlspecialchars
,前台接受到的代码是安全替换后的,解析起来比较麻烦。
三、重启 web-msg-sender 服务。
在 web-msg-sender 根目录下分别执行下面的命令,使步骤二中的改动生效:
php start.php reload
php start.php restart -d
四、前台接受并解析 json 字符串即可。
// 后端推送来消息时
socket.on('new_msg', function(msg){
console.log(JSON.parse(msg));
});
五、实际效果: