php中fsockopen的多线程ping数百个主机解决方案

问题描述 投票:0回答:1

我正在运行一个网站,该网站监视一些服务器,并且每天都会添加更多服务器。

遗憾的是,我当前的解决方案非常慢(31 台服务器的加载时间约为 10 秒)。我正在使用 fsockopen 检查 IP 和端口。因为我使用条目(主机和端口)解析 XML,所以我必须创建一个函数并在解析器中使用该函数,以便网站的访问者可以看到服务器的在线或离线状态。

我当前的“checkserver”功能如下所示:

function checkServer($ip, $port)
{
    $fsockopen = @fsockopen($ip, $port, $errorNo, $errorStr, 1);
    if (!$fsockopen) 
        return false;

    else return true;
}

在解析器中,服务器状态的“if”规则如下所示:

if (checkServer((string)$server->host, (string)$server->port))
    {
        echo "SERVER ONLINE!";
    }
else 
    {
        echo "SERVER OFFLINE!";
    }

其中

$server
是 XML
<serverlist></serverlist>
标记中列出的每个服务器。

我已经尝试将 fsockopen 的超时从 1 更改为 0.1,但有些服务器随后显示为脱机,并且加载时间仍为 8-10 秒。

如何加快加载时间?有人可以帮我吗?这个项目对我来说非常重要。谢谢你!我真的很感谢每一个有用的答案!

php multithreading fsockopen
1个回答
1
投票

首先我建议缓存。我不确定有多少用户会打开该页面,但如果每秒有多个用户打开该页面,您将需要处理大量流量,从长远来看可能会产生问题。

您有 2 个解决方案:

  • 使用异步事件可以让您做您想做的事情。这里有一些库可以帮助您执行此操作。到目前为止我还没有使用过所以我不能说哪个是最好的。

  • 使用欺骗并使用exec和命令行的库:https://github.com/oliverde8/PHP-AsynchronousJobs

  • 使用pthread库,这不是用php编码的库,因此您需要将其二进制文件添加到您的http://pthreads.org/。您可以在上面添加另一个库以方便使用

  • 最后使用 javascript,打开页面,然后一些 ajax 为每个服务器单独调用您的 php 并询问状态。

© www.soinside.com 2019 - 2024. All rights reserved.