0

我试图找出一种方法,让我的客户可以通过 php ping 我的服务器,然后将结果检索为像“15 MS”这样的格式。

我最终找到了一种服务器可以 ping 服务器的方法。但是我希望能够让远程用户以某种方式 ping 服务器,或者可能让服务器 ping 客户端?

function track($host, $port, $timeout) {
$firstTime = microtime(true);
$sock = fSockOpen($host, $port, $errno, $errstr, $timeout);
if (!$sock) {
echo "<b>Offline</b>";
}
$secondTime = microtime(true);
$ping = round((($secondTime - $firstTime) * 1000), 0);
echo $ping." ms";
}

track($_SERVER["REMOTE_ADDR"], 80, 10);

我尝试了这个功能,让服务器 ping 客户端以查看客户端/服务器之间的响应时间。

fsockopen() [function.fsockopen]: 无法连接到 XXXXXXXXXXX:80

4

3 回答 3

2

我正在想办法让我的客户可以通过 php ping 我的服务器

为什么?知道这些信息有什么价值?虽然我注意到 Emil 的回答没有解决问题,但它可能会解决问题 - ICMP 数据包到达服务器并返回所需的时间与在端口 80 上完成 TCP 握手所需的时间不同通过互联网(如果网络服务器未饱和,它们在 LAN 上应该大致相同)。

如果您想获得有关 RTT 时间的良好信息,那么更好的解决方案是使用网络监控工具/软件。PastMon是一个明显的候选者。

如果您确实必须从客户端发送 ping,那么您需要使用 java applet / flash / activeX 来执行此操作(假设它们具有执行 ping 所需的低级 TCP 堆栈访问)。

C。

于 2010-06-23T13:27:51.173 回答
0

您必须在 JavaScript 中执行此操作。客户端根本无法运行 PHP,并且当客户端的防火墙阻止来自外部的请求(通常是这种情况)时,您尝试 ping 客户端将无法正常工作。

在 JS 中构建一个“ping”函数,通过 AJAX 获取页面几次。此示例基于 jQuery 框架构建:

网页/JS

<script src="jquery-1.4.2.min.js"></script>
<script>
var global_runs = 0;
function ping(data) {
        var op = "";
        if(global_runs == 0) {
                op = "start";
        }else if(global_runs == 3){
                op = "end";
        }else if(global_runs > 3) {
                return;
        }
        global_runs++;
        $.post("ping.php", {op: op}, ping);
        if(data != null) {
                $("#time").text(data + " MS");
        }
}

$(document).ready(function(){
        //Start pinging
        ping();
});
</script>

<p id="time">Time will be here</p>

ping.php

<?php
session_start();
if($_POST['op'] == 'start' || !isset($_SESSION['start'])) {
        $_SESSION['start'] = microtime(true);
        $_SESSION['runs'] = 0;
}else{
        $_SESSION['runs']++;
        $now = microtime(true);
        $time = $now - $_SESSION['start'];

        echo ($time / $_SESSION['runs']) * 1000; //milliseconds
}
?>

我并没有真正使用end这里的 op,但它可以用来让服务器现在这是最后一个 ping 请求。请注意,此代码信任客户端,这意味着您可能需要在服务器端的安全性方面做一些额外的工作(也许从服务器端拿走“操作”的整个概念并只发送 ping?)。此外,您可能希望每个页面都有不同的计数器,可能由您在第一个请求中返回的某个令牌标识。

另请注意,这也取决于 HTTP 和 CPU 延迟,而不仅仅是网络,但我认为它尽可能好。

于 2010-06-23T05:12:22.783 回答
0

是什么让您认为客户端会可靠地响应 ICMP 回显请求?

更好的解决方案是编写客户端 Java 小程序(或 JavaScript?)来 ping 您的服务器。

请记住,安全限制将限制这两种语言只能与它们的源服务器进行通信。您将无法允许您的用户 ping 除您自己的服务器之外的服务器......但这在您的情况下似乎不是问题。

于 2010-06-23T04:17:35.317 回答