2

fsockopen() を使用してリスト内の多数の接続を呼び出し、さまざまな IP/ホストおよびポートのオンライン ステータスを確認しています ...

<?php
$socket = @fsockopen($row[2], $row[3], $errnum, $errstr, 1);
if ($errnum >= 1) { $status = 'offline'; } else { $status = 'online';}
fclose($socket);

動作する場合、私はそれについて不平を言っているわけではありませんが、リストで取得している約 15 個の IP/ポートがあります (php for() コマンド ..)。これを行うためのより良い方法があるかどうか疑問に思っていましたか?この方法は非常に遅いです!?! サーバーがすべての応答を返すまでに約 1 ~ 2 分かかります。

アップデート:

<?php
$socket = @fsockopen("lounge.local", "80", $errnum, $errstr, 30);
if ($errnum >= 1) { $status = 'offline'; } else { $status = 'online'; }
?>

リストに表示されます:「ReadyNAS AFP readynas.local:548 online」

これ以上何を話せばいいのかわからない?結果のコレクションをロードするのに永遠に時間がかかります...

4

7 に答える 7

3

私自身の経験から:

このコード:

$sock=fsockopen('www.site.com', 80);

に比べて遅いです:

$sock=fsockopen(gethostbyname('www.site.com'), 80);

PHP5.4でテスト済み。同時に多数の接続を行う場合は、ホスト解決の結果を保持して再利用し、スクリプトの実行時間をさらに短縮できます。次に例を示します。

function myfunc_getIP($host) {
   if (isset($GLOBALS['my_cache'][$host])) {
      return $GLOBALS['my_cache'][$host];
   }

   return $GLOBALS['my_cache'][$host]=gethostbyname($host);
}

$sock=fsockopen(myfunc_getIP('www.site.com'), 80);
于 2012-08-21T19:29:05.357 に答える
2

URL に「ping」を実行する場合は、curl を使用することをお勧めします。なぜですか? curl を使用して ping を並行して送信できます。こちらをご覧ください -> http://www.php.net/manual/en/function.curl-multi-init.php。以前のプロジェクトでは、リアルタイム データをサーバーにフィードすることになっていたため、ホストが生きているかどうかを確認するためにホストに ping を実行していましたが、Curl が唯一の選択肢でした。そのアドバイスは、あなたの問題の正しい解決策ではないかもしれません.

于 2011-03-06T16:36:01.690 に答える
1

と の結果を比較しましたfsockopen(servername)fsockopen(ip-address)? タイムアウト パラメータが変化しない場合、問題はネーム サーバーにある可能性があります。IP アドレスを使用した fsockopen の方が速い場合は、ネーム サーバーを修正するか、ドメインを /etc/hosts ファイルに追加する必要があります。

于 2011-03-06T16:37:55.213 に答える
0

これを少し違う方法で行うことをお勧めします。このホストを次のようなデータベースのテーブルに入れます。

++++++++++++++++++++++++++++++++++++
| host | port | status | timestamp |
++++++++++++++++++++++++++++++++++++

そして、5 分に 1 回または必要な頻度で実行する cron スクリプトのステータス チェック部分を移動します。このスクリプトは、ホスト:ポートをチェックし、各レコードのステータスとタイムスタンプを更新し、ページで db クエリを実行して、ホスト、そのステータス、および最後にチェックされた時刻 (1 分前など) を表示します。 ) こうすると、ページが高速に読み込まれます。

于 2011-03-06T16:25:00.713 に答える
0

PHPマニュアルによると、タイムアウトパラメータがあります。低い値に設定してみてください。

編集:ダニエルの答えに追加するには、nmapが使用するのに最適なツールかもしれません。cron ジョブを設定して、X 分ごとにレコードをスキャンして更新します。何かのようなもの

$ for ip in $(seq 6 8); 
do 
     port_open=$(nmap -oG - -p 80 10.1.0.$ip|grep open|wc -l); 
     echo "10.1.0.$ip:$port_open"; 
done

10.1.0.6:1
10.1.0.7:1
10.1.0.8:0
于 2011-03-06T16:29:28.500 に答える
0

最後のパラメータfsockopen()はタイムアウトです。次のように、これを低い値に設定して、スクリプトをより速く完了させます。

fsockopen('192.168.1.93', 80, $errNo, $errStr, 0.01)
于 2011-03-06T16:34:28.700 に答える
0

fsockopen リクエストが遅いという問題がありましたが、wget は本当にきびきびしていました。私の場合、ホスト名に ipv4 と ipv6 の両方のアドレスが含まれていたが、ipv6 がダウンしていたために発生していました。そのため、ipv6 がタイムアウトするまで、各リクエストで 20 秒ほどかかりました。

于 2013-07-04T08:00:47.797 に答える