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ハンドシェイクを完了するのにかかる時間とは異なりますインターネット全体で(Webサーバーが飽和していなければ、LANでもほぼ同じはずです)。

RTT 時間に関する適切な情報を取得したい場合は、ネットワーク監視ツール/ソフトウェアを使用することをお勧めします。PastMonは明らかな候補です。

本当にクライアントから ping を送信する必要がある場合は、Java アプレット / フラッシュ / ActiveX を使用してこれを行う必要があります (これらには、ping を実行するために必要な低レベルの TCP スタック アクセスがあると仮定します)。

C.

于 2010-06-23T13:27:51.173 に答える
0

これは JavaScript で行う必要があります。クライアントは PHP をまったく実行できず、ファイアウォールが外部からの要求をブロックしている場合 (よくあるケース)、クライアントに ping を実行しようとしても機能しません。

AJAX によってページを数回フェッチする「ping」関数を JS で作成します。この例は、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
}
?>

ここでは op を実際には使用しませんがend、これが最後の ping 要求であるため、サーバーに許可するために使用できます。このコードはクライアントを信頼することに注意してください。つまり、サーバー側のセキュリティに追加の作業が必要になる可能性があります (サーバー側から "ops" の概念全体を取り除き、ping を送信する必要があるのでしょうか?)。また、ページごとに異なるカウンターが必要になる可能性があり、最初のリクエストで返すトークンによって識別される可能性があります。

また、これはネットワークだけでなく、HTTP と CPU のレイテンシにも依存することに注意してください。

于 2010-06-23T05:12:22.783 に答える
0

クライアントが ICMP エコー要求に確実に応答すると思われる理由は何ですか?

より良い解決策は、クライアント側の Java アプレット (または JavaScript ?) を記述してサーバーに ping を実行することです。

セキュリティ上の制限により、両方の言語が元のサーバーにのみ通信するように制限されていることに注意してください。ユーザーが自分のサーバー以外のサーバーにpingを実行することを許可することはできません...しかし、それはあなたの場合には問題ではないようです.

于 2010-06-23T04:17:35.317 に答える