monitor/src/Monitor.php
2024-11-10 21:16:01 +08:00

70 lines
2.0 KiB
PHP

<?php
namespace Laysense\Monitor;
use WebSocket\Client;
class Detection
{
var $dest='ws://172.83.153.167:2345';
var $nodeinfo;
public function getNode()
{
$nodeinfo = $this->callWebSocet('{"msg":"getnodelist"}');
$this->nodeinfo=$nodeinfo;
}
public function ping($host,$count)
{
$ping = $this->callWebSocet('{"msg":"ping","target:'.$host.'","type":"ICMP","count":'.$count.'}');
foreach($this->nodeinfo as $node){
$ping[$node->nodeid]['nodeinfo']=$node;
}
$this->ping=$ping;
}
public function getDelay()
{
$alldelay = 0;
foreach($this->ping as $id=>$node){
if((!isset($node['nodeinfo'])) || (!isset($node['delay'])) || $node['delay']<=10){
unset($this->ping[$id]);
}else{
$alldelay += $node['delay'];
}
}
$alldelay = $alldelay/count($this->ping);
return $alldelay;
}
private function callWebSocet(){
$client = new Client($this->dest);
// 发送消息
$client->send($msg);
// 接收消息
while (true) {
try {
$receive=$client->receive();
$receive = json_decode($receive);
if($receive->msg="setnodes"&&isset($receive->nodes)){
$response = $receive->nodes;
break;
}elseif(isset($receive->delay)){
$response[$receive->nodeid]['delay'] = $receive->delay/1000;
}else{
$response[$receive->nodeid]['ip'] = $receive->ip;
$response[$receive->nodeid]['loc'] = $receive->loc;
$response[$receive->nodeid]['asn'] = $receive->asn;
$response[$receive->nodeid]['org'] = $receive->org;
}
} catch (\WebSocket\ConnectionException $e) {
break;
}
}
// 关闭连接
$client->close();
return $response;
}
}