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

时间:2015-10-28 16:54:10

标签: php sockets tcp ports diagnostics

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

有没有人对如何实现这一点有任何想法?我最初的想法是我需要使用shell_exec。

1 个答案:

答案 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)。