環(huán)境:windows 2012 r2 + php 7.4.2
不開啟SSL的時(shí)候,一切正常,連續(xù)開機(jī)測(cè)試過2天都沒問題
但是自從配置了SSL之后,每隔一個(gè)小時(shí)以后就會(huì)出現(xiàn)服務(wù)端提示推送成功,但客戶端無法收到數(shù)據(jù)的問題。
此時(shí),客戶端重啟打開瀏覽器,可以正常連接并發(fā)送心跳!服務(wù)端進(jìn)行推送,也會(huì)有數(shù)據(jù)返回。麻煩各位幫忙分析一下!非要用windows環(huán)境,我也確實(shí)搞不懂哪里出問題,才來這里進(jìn)行提問!
代碼如下
<?php
require 'vendor/autoload.php';
use Workerman\Worker;
use Workerman\Lib\Timer;
use Workerman\Connection\TcpConnection;
use GlobalData\Client as GlobalClient;
use Channel\Client as ChannelClient;
//證書
$context = array(
'ssl' => array(
'local_cert' => 'D:\wss\ssl\ws.pem',
'local_pk' => 'D:\wss\ssl\ws.key',
'verify_peer' => false,
)
);
$WsWorker = new Worker('websocket://0.0.0.0:443', $context);
$WsWorker->transport = 'ssl';
$WsWorker->count = 4;
$WsWorker->name = 'WebSocket';
$WsWorker->onWorkerStart = function ($worker){
$config = require dirname(__FILE__).'/config.php';
$worker->apiKey = strtolower($config['api_key']);
$worker->topics = array_map('strtolower',$config['topics']);
$worker->global = new GlobalClient('127.0.0.1:2207');
$worker->channel = new ChannelClient();
$worker->channel->connect('127.0.0.1:2206');
Timer::add(45,function()use($worker){
$cur_time = time();
foreach($worker->connections as $conn){
if(!isset($conn->lastAccessTime)){
$conn->lastAccessTime = time();
continue;
}
if($cur_time-$conn->lastAccessTime>=50){
echo "$cur_time<>{$conn->lastAccessTime}\r\n";
$conn->close();
}
}
});
$worker->channel->on('publish',function($data)use($worker){
$data_json = @json_decode($data,true);
if(error_get_last()){
return;
}
$topic = strtolower($data_json['topic']);
$title = strtolower($data_json['title']);
$content = strtolower($data_json['content']);
$link = strtolower($data_json['link']);
$stock = strtolower($data_json['stock']);
$send_data = [
'ctrl'=>'send',
'params'=>[
'title'=>$title,
'content'=>$content,
'link'=>$link,
'stock'=>$stock,
'topic'=>$topic,
],
'msg'=>'',
];
foreach($worker->connections as $conn){
if(isset($conn->topic) && strtolower($topic) == strtolower($conn->topic)){
$conn->send(json_encode($send_data));
}
}
});
};
$WsWorker->onMessage = function ($connection,$data){
$connection->lastAccessTime = time();
$worker = $connection->worker;
$data_json = @json_decode($data,true);
if(json_last_error()){
$connection->close();
return;
}
$ctrl = strtolower($data_json['ctrl'] ?? null);
$params = !isset($data_json['params']) || !is_array($data_json['params']) ? array() : $data_json['params'];
if(!$ctrl){
$connection->close();
return;
}elseif($ctrl == 'bind'){
$token = $params['token'] ?? '';
if($token && isset($worker->global->$token) && $worker->global->$token){
$connection->topic = $worker->global->$token;
$connection->send('{"ctrl":"ok","data":{},"msg":""}');
unset($worker->global->$token);
}else{
$connection->send('{"ctrl":"fail","data":{},"msg":"error token"}');
}
}
};
if(!defined('GLOBAL_START'))
{
Worker::runAll();
}
?>