通过PHP监控TCP/IP端口消耗

通过PHP监控TCP/IP端口消耗,php,sockets,tcp,ports,diagnostics,Php,Sockets,Tcp,Ports,Diagnostics,所以我在Azure Web应用程序上运行PHP。最近,我遇到了服务器TCP/IP端口耗尽的问题,因为我没有使用到Redis缓存的持久连接。我不认为这个问题会再次出现,但由于我没有任何可用的指标(而且我不能远程访问Azure Web应用程序),我想知道PHP中是否有任何函数允许我查看服务器当前使用的所有TCP端口的信息,以便我可以记录这些信息进行诊断 有人对如何实现这一目标有什么想法吗?我最初的想法是,我需要使用shell_exec。不幸的是,我无法在Azure Web App上实现这一点,但我认

所以我在Azure Web应用程序上运行PHP。最近,我遇到了服务器TCP/IP端口耗尽的问题,因为我没有使用到Redis缓存的持久连接。我不认为这个问题会再次出现,但由于我没有任何可用的指标(而且我不能远程访问Azure Web应用程序),我想知道PHP中是否有任何函数允许我查看服务器当前使用的所有TCP端口的信息,以便我可以记录这些信息进行诊断


有人对如何实现这一目标有什么想法吗?我最初的想法是,我需要使用shell_exec。

不幸的是,我无法在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)