服务介绍

服务介绍

原生的 PHP 不适合用于长连接,为此我们曾经为开发者提供了 Realtime Sock 服务,然而该服务需要引入 JS 文件所以不适用于客户端的开发。

因此 Hostker 开发了原生的 WebSocket 代替 RS 服务。WebSocket 可用于 PHP 与客户端实时收发消息,相比轮训实时性更高,占用资源更少。

我们会将客户端的上下线状态和发送的信息以实时 HTTP GET 方式通知给开发者在客户中心填写的回调地址。

示例

在客户中心开通后,我们会分配一个 Key 前缀用于区分用户,例如 Key 前缀是 233_ ,开发者可以选择后面接上用户 UID 像 233_1 作为 Key。

我们的 WebSocket 服务地址是 ws://ws.smartgslb.com:11233/$keywss://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 种方式,分别是:

  • 单独向某个客户端发送消息函数 WSPushMsg($key, $msg)
  • 向不超过 1000 个客户端群发相同消息 WSPushMsgs($keys, $msg)
  • 向不超过 100 个客户端群发不同的消息 WSMultiPush($array)

每次 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同上