所以我在Azure Web App上运行PHP。最近,我遇到了服务器进入TCP / IP端口耗尽的问题,因为我没有使用持久连接到我的Redis缓存。我不相信问题会再次出现,但由于我没有任何可用的指标(因为我不能只是远程进入Azure Web应用程序),我想知道PHP中是否有任何函数允许我查看有关服务器当前使用的所有TCP端口的信息,因此我可以将其记录下来进行诊断。
有没有人对如何实现这一点有任何想法?我最初的想法是我需要使用shell_exec。
答案 0 :(得分:0)
不幸的是,我无法在Azure Web App上使用它,但我认为这可以在运行自己的服务器的其他场景中使用。
class netstat {
public $PortsInUse = 0;
public $AvailablePorts = 0;
public $TotalPorts = 0;
public $Ports = array();
public function __construct () {
$p = popen('netsh int ipv4 show dynamicport tcp', 'r');
$this->TotalPorts = rtrim(trim(explode("Number of Ports : ", stream_get_contents($p))[1]));
pclose($p);
$netstat = popen('netstat -no', 'r');
$log = stream_get_contents($netstat);
pclose($netstat);
$this->Ports = array_slice(explode("\n", $log), 4);
array_pop($this->Ports);
foreach($this->Ports as &$port) {
$port = explode(" ", $port);
foreach($port as $k => $p) {
if (empty($p))
unset($port[$k]);
}
$port = array_values($port);
$port = (object)array(
"LocalAddress" => $port[0],
"ForeignAddress" => $port[1],
"Status" => $port[2],
"ProcessId" => $port[3]
);
}
$this->PortsInUse = count($this->Ports);
$this->AvailablePorts = $this->TotalPorts - count($this->Ports);
}
}
上述对象将能够显示当前正在使用的TCP端口数,以及该计算机上TCP可用的动态端口总数。它还包含一个“Ports”数组,其中包含有关每个正在使用的端口的信息,例如它们的本地和外部地址,状态和PID(进程ID)。