原生的 PHP 不适合用于长连接,为此我们曾经为开发者提供了 Realtime Sock 服务,然而该服务需要引入 JS 文件所以不适用于客户端的开发。
因此 Hostker 开发了原生的 WebSocket 代替 RS 服务。WebSocket 可用于 PHP 与客户端实时收发消息,相比轮训实时性更高,占用资源更少。
我们会将客户端的上下线状态和发送的信息以实时 HTTP GET 方式通知给开发者在客户中心填写的回调地址。
在客户中心开通后,我们会分配一个 Key 前缀用于区分用户,例如 Key 前缀是 233_ ,开发者可以选择后面接上用户 UID 像 233_1 作为 Key。
我们的 WebSocket 服务地址是 ws://ws.smartgslb.com:11233/$key 和 wss://ws.smartgslb.com:22333/$key,后者已配置证书可用于 HTTPS 页面(HTTPS 不能连接不带证书的 WebSocket)。$key 变量是上面的 Key。前端 JavaScript 参考代码:
var key = "233_1"; // 此处应该由 PHP 生成唯一 Key 并传给客户端
var wsUri ="wss://ws.smartgslb.com:22333/" + key;
websocket = new WebSocket(wsUri);
websocket.onopen = function(evt) {
// 连接成功要执行的代码
};
websocket.onclose = function(evt) {
// 连接关闭要执行的代码
};
websocket.onmessage = function(evt) {
console.log("Receive: " + evt.data);
// 收到服务器发送消息的代码,evt.data是消息内容
};
websocket.onerror = function(evt) {
console.log("ERROR: " + evt.data);
// 出现错误要执行的代码,evt.data是错误信息
};
websocket.send("OwO"); //发送消息的代码,这里表示发送OwO
假设回调地址是http://hostker.com/w.php ,收到的回调格式:
※ 8 月 1 日起不再提供客户端发送消息上报服务器功能,请开发者通过 HTTP 上报服务器
服务器向客户端实时推送消息有 3 种方式,分别是:
每次 PHP 运行时只能发送 1 次消息,否则返回状态码 3。
2016年6月15日起服务器发送消息改为异步模式,返回状态将表示任务是否成功分配,通常成功分配的任务都会群发成功。
示例代码:
// 单发消息
$key='233_1'; // 客户端 Key
$msg='OwO'; //要发送的消息
$status=WSPushMsg($key, $msg);
// $status=0. 发送任务已分配,1. 传入 Key 有误,2. 发送任务分配失败,3. 本次 PHP 已发送不可继续执行,5. 发送的消息长度超过 1024
// 群发相同消息
$keys='233_1 233_2 233_5'; // 多个 Key 使用英文半角空格分隔
$status=WSPushMsgs($keys, $msg);
// $status同上
// 群发不同消息
$arr = array();
$arr[0]['key']='233_1';
$arr[0]['msg']='OwO';
$arr[1]['key']='233_2';
$arr[1]['msg']='030';
// 数组格式以此类推..
$status = WSMultiPush($arr);
// $status同上