服務端我是使用Workerman+GatewayWorker+TP5組合使用。
在TP5的runtime>log下經(jīng)常收到
這樣的錯誤。
這種會對服務端有影響嗎?如何處理呢?
這樣看應該是有裝成功吧?
這個沒遇到過,看起來是業(yè)務進程和gateway建立起了1314個連接,按照你的配置應該最多建立16個連接才對。
猜測是調(diào)用了某個接口,里面包含了大量client_id,這些client_id里的ip和端口信息是過時的或者是錯誤的。
這個錯,基本上都是在我重啟服務端時出現(xiàn)的,我客戶端是使用C#寫的,現(xiàn)在大概有30-50個左右,客戶端如果有連接上后會先觸發(fā)注冊登錄操作,登錄成功后,就開始大量發(fā)送數(shù)據(jù)給服務端?;蚺c服務端交換數(shù)據(jù)處理。有比較頻繁的操作數(shù)據(jù)庫。不知與此有關否?如果是,如何減少它的壓力呢?
這段時間跟蹤分析發(fā)現(xiàn),我的這幾個問題,全部都是由于這個引起的
我在onconnect,onclose等能找到的相關聯(lián)的地方都加上日記記錄了,發(fā)現(xiàn)接收客戶端發(fā)過來的信息都是正常的。
這個是在接收ping心跳信息時并且是在服務端重啟后的剛開始一段時間內(nèi)就會報這個錯。但是過段時間就正常了。
還有這兩個在半夜2點左右時接收ping心跳數(shù)據(jù)時就出錯了。
這個調(diào)用某個接口包含大量client_id這種的,如何去調(diào)試呢?在業(yè)務代碼上如果增加調(diào)試方式?
還是說只能等出這個錯時,執(zhí)行php start.php status去跟蹤查看原因?
這是心跳的處理,心跳數(shù)據(jù)是每隔10秒一個,數(shù)據(jù)內(nèi)容也不大就一些簡單的驗證而以。
運行php start.php status后出現(xiàn)幾個busy的進程
通過strace -ttp 進程id發(fā)現(xiàn)好像是卡在這里
運行l(wèi)sof -nPp查看出現(xiàn)busy進程的顯示
發(fā)現(xiàn)好多是連接9200的,這個是我ES服務的
我ES只有插入或更新數(shù)據(jù)時才用到,是卡在插入這里?但是我看了是插入有成功的。
這個我ES的代碼
<?php
namespace app\common\library;
use app\admin\library\Common;
use Elasticsearch\ClientBuilder;
use think\Exception;
class EsUtils{
protected $dbName;
protected $tbName;
protected $client;
public function __construct($dbName='vbox_wechat_message',$tbName='_doc',$hostUrl=[[
'host'=>'8.8.8.8',
'port'=>9200,
'scheme'=>'http',
'user'=>'elastic',
'pass'=>'45454'
]])
{
//try{
$this->dbName=$dbName;
$this->tbName=$tbName;
$this->client=ClientBuilder::create()->setHosts($hostUrl)->build();
/*}catch (Exception $ex){
$r=$ex->getMessage();
echo json_encode($r);
}*/
}
private function object2array($object){
if(is_object($object)){
foreach ($object as $key=>$value){
$array[$key]=$value;
}
}else{
$array=$object;
}
return $array;
}
/*
* 初始化params參數(shù)
* #return array
* */
protected function initParams(){
return [
'index'=>$this->dbName, ##索引:數(shù)據(jù)庫
//'type'=>$this->tbName, ##類型:數(shù)據(jù)表,7.0以后不再需要指定此值了,已默認為_doc
];
}
/*
* 把數(shù)據(jù)庫里的數(shù)據(jù)導入ES
* $param $data
* */
public function add($client_id,$data){
try{
$params=$this->initParams();
if(isset($data['id'])){
$params['id']=$data['id'];
}
$params['body']=$data;
$r=$this->client->index($params);
}catch (Exception $ex){
$r=$ex->getMessage();
Common::logssave([
'$client_id'=>$$client_id,
'admin_id'=>0,
'msg'=>'信息入到ES庫里時出錯',
'data'=>json_encode($data),
'errlogs'=>json_encode($r),
]);
}
return $r;
}
public function edit($client_id,$data){
try{
$params=$this->initParams();
if(isset($data['id'])){
$params['id']=$data['id'];
unset($data['id']);
}
$params['body']=[
'doc'=>$data
];
$r=$this->client->update($params);
}catch (Exception $ex){
$r=$ex->getMessage();
Common::logssave([
'client_id'=>$client_id,
'admin_id'=>0,
'msg'=>'修改ES數(shù)據(jù)時出錯了',
'data'=>json_encode($data),
'errlogs'=>json_encode($r),
]);
}
return $r;
}
}
調(diào)用是使用
public static function savepyqMsg($client_id,$data){
if($data){
$data['id']=$data['object_id'];
$es=new EsUtils('moments');
$resultData=$es->add($client_id,$data);
}
}
//保存用戶留言數(shù)據(jù)
public static function savemessage($client_id,$data){
try {
if($data){
$data['id']=$data['msgid'];
$es=new EsUtils();
$resultData=$es->add($client_id,$data);
}
}catch (Exception $ex){
print_r('保存聊天數(shù)據(jù)到ES里出錯:'.$ex->getMessage());
print_r(PHP_EOL);
Common::logssave([
'client_id'=>$client_id,
'admin_id'=>0,
'msg'=>'保存聊天數(shù)據(jù)到ES里出錯',
'data'=>json_encode($data,true),
'errlogs'=>'出錯內(nèi)容:'.$ex->getMessage(),
]);
}
}
在保存時,也沒出現(xiàn)啥錯誤,都是正常的。