基于workerman的PC端及手机端客服系统
第一步部署服务器
1.在workerman官网下载库,放在项目目录下
2.通信服务器,一个需要命令行执行的PHP脚本,不依赖于Apache和NGINX;下面看代码:
<?php
use Workerman\Worker;
require_once __DIR__ . '/webChat/Autoloader.php';
// 创建一个Worker监听端口,协议一般是websocket,地址0.0.0.0表示其他所有都可连接,如果只要本地可连接改为本地地址,端口一般2000以上
$worker = new Worker("websocket://0.0.0.0:2016");
// 启动4个进程对外提供服务,如果要实现一对一聊天,切记只开一个进程
$worker->count = 1;
//定义一个连接池
$connectArr = array();
//服务端收到消息
$worker->onMessage = function($con, $msg) use(&$connectArr){
$msgArr = json_decode($msg,true);
$from = @$msgArr['from'];
$to = @$msgArr['to'];
$sendtime = time();
switch($msgArr['act']){
case 'connect':
if(!isset($connectArr[$from])){
//存入连接池
$connectArr[$from] = $con->id;
}
break;
//$con->send($from.'上线了,连接ID是:'.$con->id);
case 'message':
$msgtype = @$msgArr['msgtype'];
$content = @$msgArr['content'];
$isread = 0;
if(isset($connectArr[$to])){
$isread = 1;
$returnmsg = json_encode(array('from'=>$from,'to'=>$to,'msgtype'=>$msgtype,'content'=>$content,'sendtime'=>$sendtime,'isread'=>1));
$con->worker->connections[$connectArr[$to]]->send($returnmsg);
//需要群发的话就循环连接池数组一个个发送;
}
break;
}
//$con->send(json_encode($connectArr));
};
//send()方法不能直接发送数组,需要转为json
//客户端关闭时
$worker->onClose = function($con) use(&$connectArr){
$k = array_search($con->id, $connectArr);
unset($connectArr[$k]);
//$con->send('关闭');
};
Worker::runAll();
第二步前端JS连接
var con = new WebSocket('ws://你的地址:2016');
con.onopen = function(){
var msg = {act:'connect',from:cid,to:to,msgtype:1,content:'你说什么'};//连接请求,存身份id入连接池
con.send(JSON.stringify(msg));
};
//收到消息触发
con.onmessage = function(msg){
//根据消息类型做不同处理
var message = $.parseJSON(msg.data);//这一句必须
}