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)); });