2010-06-23 33 views
0

J'essaie de trouver un moyen par lequel mes clients peuvent envoyer une requête ping à mon serveur via php, puis récupérer les résultats dans un format comme celui-ci "15 MS". J'ai fini par trouver un moyen permettant aux serveurs de pinguer des serveurs. Cependant, je veux pouvoir faire en sorte que l'utilisateur distant fasse un ping sur le serveur, ou peut-être que le serveur envoie un ping au client peut-être?Comment faire pour que mon client envoie un ping au serveur?

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); 

J'ai essayé cette fonction, où j'obtiendrais le serveur ping sur le client pour voir le temps de réponse entre le client/serveur.

fsockopen() [function.fsockopen]: impossible de se connecter à XXXXXXXXXXX: 80

Répondre

0

Ce que vous fait penser que les clients vont répondre de manière fiable aux demandes d'écho ICMP?

Une meilleure solution serait d'écrire une applet Java côté client (ou JavaScript?) Pour envoyer une requête ping à votre serveur. N'oubliez pas que les restrictions de sécurité limitent les deux langues à ne communiquer qu'avec leur serveur d'origine. Vous ne serez pas en mesure d'autoriser vos utilisateurs à faire un ping sur un serveur autre que le vôtre ... mais cela ne semble pas être un problème dans votre cas.

0

Vous devez faire ceci en JavaScript. Le client ne peut pas exécuter PHP du tout, et votre tentative de ping sur le client ne fonctionnera pas lorsque leur pare-feu bloque les demandes de l'extérieur (ce qui est souvent le cas).

Construire une fonction "ping" dans JS qui récupère une page plusieurs fois par AJAX. Cet exemple est basé sur le framework jQuery:

page Web/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 
} 
?> 

Je ne fais pas vraiment l'utilisation de l'op end ici , mais il peut être utilisé pour laisser le serveur maintenant que c'est la dernière requête ping. Notez que ce code fait confiance au client, ce qui signifie que vous aurez peut-être besoin de plus de travail sur la sécurité sur le serveur (peut-être enlever toute la notion de "ops" du serveur et envoyer les pings?). Aussi, vous voulez probablement des compteurs différents pour chaque page, peut-être identifiés par un jeton que vous retournez dans la première requête.

Notez également que cela dépend également de la latence HTTP et du processeur, pas seulement du réseau, mais je pense que c'est aussi bon que vous pouvez l'obtenir.

+0

-1 pour « fonction JS « » Construire un » ping va alors à de grandes longueurs décrivant comment mesurer une requête HTTP via TCP. – symcbean

+3

symcbean, c'est la meilleure solution que je connaisse. Je déclare clairement que la latence HTTP et CPU sera également incluse, mais si vous connaissez un moyen d'envoyer des requêtes ICMP ou de mesurer autrement la latence du réseau, je serai heureux d'avoir tort. –

+0

+1 pour signaler que vous mesurez également le temps d'exécution du logiciel de surveillance :) – symcbean

1

J'essaie de trouver un moyen où mes clients peuvent ping mon serveur via php

Pourquoi? Quelle est la valeur de connaître cette information? Bien que j'ai noté que la réponse d'Emil n'abordait pas la question, elle pourrait résoudre le problème - le temps nécessaire pour qu'un paquet ICMP accède à un serveur et revienne sera différent du temps nécessaire pour terminer une prise de contact TCP sur le port 80 sur Internet (ils devraient être à peu près les mêmes sur un réseau local à condition que le serveur web ne soit pas saturé).

Si vous voulez obtenir de bonnes informations sur les temps RTT, alors une meilleure solution serait d'utiliser un outil/logiciel de surveillance réseau. PastMon est un candidat évident.Si vous devez vraiment envoyer un ping depuis le client, alors vous devez le faire en utilisant une applet java/flash/activeX (en supposant que ceux-ci ont l'accès à la pile TCP de bas niveau requis pour effectuer un ping) .

C.

+0

Ce que dit symcbean. Sans oublier que de nombreux routeurs ISP donnent la priorité au trafic ICMP au niveau ou à proximité de la priorité la plus faible. Interdire le ping-then-do! – dbasnett