2010-06-23 2 views
0

Я пытаюсь понять способ, которым мои клиенты могут пинговать мой сервер через php, а затем извлекать результаты в формате, таком как «15 MS».Как получить моего клиента на сервер 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); 

Я попробовал эту функцию, где я получить сервер, чтобы свистеть клиент, чтобы увидеть время отклика между клиентом/сервером.

fsockopen() [function.fsockopen]: не удалось подключиться к XXXXXXXXXXX: 80

ответ

0

Что заставляет вас думать, клиенты собираются надежно реагировать на ICMP эхо-запросов?

Лучшим решением было бы написать клиентский Java-апплет (или JavaScript?) Для ping вашего сервера.

Помните, что ограничения безопасности ограничивают оба языка только для связи с сервером происхождения. Вы не сможете разрешить своим пользователям пинговать сервер, кроме ваших собственных ... но это, похоже, не является проблемой в вашем случае.

0

Вы должны сделать это в JavaScript. Клиент не может запускать PHP вообще, и ваша попытка выполнить ping-клиент не будет работать, если их брандмауэр блокирует запросы извне (что часто бывает).

Создайте функцию «ping» в JS, которая несколько раз извлекает страницу 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 ор здесь , но он может быть использован для того, чтобы позволить серверу теперь, что это последний запрос ping. Обратите внимание, что этот код доверяет клиенту, а это значит, что вам может потребоваться дополнительная работа над безопасностью на сервере (может быть, забрать все понятие «ops» с сервера и отправить сообщения ping?). Кроме того, вам, вероятно, нужны разные счетчики для каждой страницы, возможно, определенные некоторыми маркерами, которые вы возвращаете в первом запросе.

Также обратите внимание, что это зависит также от задержки HTTP и CPU, а не только от сети, но я думаю, что это так хорошо, как вы можете ее получить.

+0

-1 для «Построить„“функцию в JS» пинг затем собирается большие длины, описывающие, как измерить запрос HTTP через TCP. – symcbean

+3

symcbean, это лучшее решение, о котором я знаю. Я четко заявляю, что также будут включены задержки HTTP и CPU, но если вы знаете способ отправки ICMP-запросов или иным образом измеряете задержку в сети, я буду рад, что окажется ошибочным. –

+0

+1 за то, что вы также измеряете время выполнения программного обеспечения для мониторинга :) – symcbean

1

Я пытаюсь найти способ, где мои клиенты могут пинг мой сервер через PHP

Почему? Какая ценность в знании этой информации? Хотя я заметил, что ответ Эмиля не затрагивает вопрос, он может решить проблему - время, которое требуется для того, чтобы пакет ICMP перешел на сервер и вернулся, будет отличаться от времени, затраченного на завершение рукопожатия TCP на порту 80 через Интернет (они должны быть примерно одинаковыми в локальной сети, если веб-сервер не насыщен).

Если вы хотите получить точную информацию о времени RTT, лучшим решением было бы использовать инструмент/программное обеспечение для мониторинга сети. PastMon - очевидный кандидат.

Если вам действительно нужно отправить пинг с клиента, вам нужно будет сделать это с помощью java-апплета/flash/activeX (при условии, что у них есть доступ к стеку с низким уровнем TCP для выполнения пинга) ,

C.

+0

Что сказал symcbean. Не говоря уже о том, что многие маршрутизаторы интернет-провайдеров определяют приоритет трафика ICMP на минимальном приоритете. Бан-пинг-то-делай! – dbasnett