前言:
在crm开发过程中,需要实现即时消息通讯的功能,在这里选择使用一款web长连接推送框架---web-msg-sender,此框架基于WebSocket长连接通讯。 通过后台推送消息,消息可以即时推送到客户端,非轮询,实时性非常好,性能很高。
特点:
- 多浏览器支持
- 长连接推送(websocket或者comet),消息即时到达
- 支持向单个/多个用户推送
- 支持在线用户/在线页数实时统计
效果:
- 效果1
- 效果2
支持实时的在线人数和在线页面统计
功能实现:
二:下载web-msg-sender并解压到项目目录下
三:启动
(1)linux系统cd到到框架目录里运行 php start.php start -d 。
(2)windows系统进入到框架目录里双击start_for_win.bat文件启动。
四:实现
(1)【接收消息】前端代码实现
<script src='http://cdn.bootcss.com/socket.io/1.3.7/socket.io.js'></script>
<script>
// 连接服务端,xiaozhe.net:2120换成实际部署web-msg-sender服务的域名或者ip
var socket = io('http://xiaozhe.net:2120');
// uid可以是自己网站的用户id,以便针对uid推送以及统计在线人数,
uid = 123;//用户登录后,这里要使用正确的用户ID
// socket连接后以uid登录
socket.on('connect', function(){
socket.emit('login', uid);
});
// 后端推送来消息时
socket.on('new_msg', function(msg){
console.log("收到消息:"+msg);
});
// 后端推送来在线数据时
socket.on('update_online_count', function(online_stat){
console.log(online_stat);
});
</script>
(2)【发送消息】后端调用api向任意用户推送
/**
* 推送即时消息
* @author Xiaozhe
* @DateTime 2019-11-06T10:10:18+0800
* @param [int] $to_uid 用户ID
* @param [string] $msg 消息内容
*/
public function PushMsgNow($to_uid,$msg) {
if(!$to_uid) $to_uid = "";//如果不传用户ID,则推送给全部用户
// 推送的url地址,使用自己的服务器地址
$push_api_url = "http://xiaozhe.net:2121/";
$post_data = array(
"type" => "publish",
"content" => $msg,
"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);
if ($return) {
$code = 1;
} else {
$code = 0;
}
return $code;
}
注意事项:
(1)如果无法访问请检查服务器防火墙,如果是云服务器还要设置安全组,需要放行所需要的接口;
(2)期间,服务器重启之后,发现即时通讯无法使用,发现是重启之后,socket服务没有启动,此时把服务重新启动就可以解决,也可以添加开机启动脚本。