描述:
使用gatewayWorker部署ws服務(wù)端,businessWorker在發(fā)出數(shù)據(jù)到gateway的時(shí)候,先進(jìn)行 gzip 壓縮,然后再發(fā)送。
問題:
客戶端首次建立連接的時(shí)候,出現(xiàn)服務(wù)器端發(fā)送的首次數(shù)據(jù),類型為Text,而不是Binary類型。
(附件中紅色方框 內(nèi)容為 Text的,屬于異常的情況)
相關(guān)gateway代碼、Events代碼
//gateway啟動(dòng)文件的 二進(jìn)制傳輸設(shè)置
$gateway->onConnect = function($connection)
{
$connection->onWebSocketConnect = function($connection , $http_header)
{
$connection->websocketType = Workerman\Protocols\Websocket::BINARY_TYPE_ARRAYBUFFER;
};
};
//Events模塊 簡(jiǎn)要相關(guān)的地方
class Events
{
public static function onWorkerStart($businessWorker)
{
//process_timeout
$businessWorker->processTimeoutHandler = function ($trace_str, $exception) use ($businessWorker) {
\Workerman\Worker::log($trace_str);
return true;
};
}
public static function onConnect($client_id)
{
$group_name = 'rate_group';
//獲?。蛻舳诵枰模┏跏蓟瘮?shù)據(jù)
$rateData = self::getExRate();
$json_data = json_encode(['type' => $group_name, 'data' => $rateData]);
//發(fā)送gzip數(shù)據(jù)(此處就是附件圖片出現(xiàn) Text 的情況)
if (!empty($json_data)) {
$gzip_msg = gzencode($data);
Gateway::sendToClient($client_id, $gzip_msg);
}
//訂閱頻道
Gateway::joinGroup($client_id, $group_name);
}
onConnect
是TCP連接建立是執(zhí)行,onWebSocketConnect
是TCP連接建立完畢完成websocket握手后執(zhí)行。
所以Events::onConnect
先執(zhí)行,然后才執(zhí)行onWebSocketConnect
,所以Events::onConnect
里業(yè)務(wù)邏輯發(fā)送數(shù)據(jù)的時(shí)候gateway一側(cè)$connection->websocketType = Workerman\Protocols\Websocket::BINARY_TYPE_ARRAYBUFFER;
可能還沒執(zhí)行到。
gateway.php 里onConnect改成如下試下:
//gateway啟動(dòng)文件的 二進(jìn)制傳輸設(shè)置
$gateway->onConnect = function($connection)
{
$connection->websocketType = Workerman\Protocols\Websocket::BINARY_TYPE_ARRAYBUFFER;
};