我正试图找到一种方法,我的客户可以通过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
答案 0 :(得分:1)
我正试图想办法让我的客户可以通过php ping我的服务器
为什么呢?了解这些信息有什么价值?虽然我注意到Emil的答案没有解决这个问题,但它可能解决了这个问题 - ICMP数据包进入服务器并返回的时间与在端口80上完成TCP握手所需的时间不同通过互联网(如果网络服务器没有饱和,它们应该在局域网上大致相同)。
如果您想获得有关RTT时间的良好信息,那么更好的解决方案是使用网络监控工具/软件。 PastMon是一个明显的候选人。
如果你真的必须从客户端发送ping,那么你需要使用java applet / flash / activeX(假设它们具有执行ping所需的低级TCP栈访问)。
下进行。
答案 1 :(得分:0)
是什么让您认为客户可以可靠地响应ICMP回应请求?
更好的解决方案是编写客户端Java小程序(或JavaScript?)来ping您的服务器。
请记住,安全限制将限制两种语言仅与通信服务器进行通信。除了您自己的用户之外,您将无法允许用户ping服务器......但在您的情况下,这似乎不是问题。
答案 2 :(得分: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延迟,而不仅仅是网络,但我认为它可以获得它。