0

新しい行で区切られた IP アドレスを保持するファイルを読み込もうとしているときに、このエラーが発生しました。私がやりたいことは、たくさんの IP を保持しているファイルを読み取り、適切な記録があるかどうかを確認することです。これは私のコードです:

$file = "test.sh";

if (is_file($file) && is_readable($file)) {
    $get_file_data = file_get_contents($file);

    $turn_to_array = explode("\n", $get_file_data);

    foreach ($turn_to_array as $key => $value) {

        if (filter_var($value, FILTER_VALIDATE_IP)) {
            echo gethostbyaddr(trim($value));
        } else {
            echo "IP invalid";
        }
    }
}

私のtest.shファイルは次のようになります:

編集:IPの例

180.1.1.1
181.1.1.2

ファイルを解析するためにいくつかの特定のテストを追加する必要がありますか、それとも他の問題がありますか?

使用された非常にユニークな方法によって引き起こされたエラー:

警告: gethostbyaddr(): アドレスは有効な IPv4 または IPv6 PHP ではありません

解決しました。

私のコードは機能していましたが、これらの IP には存在しなかったため、rdns レコードを適切に取得できませんでした。ホスト 185.1.1.1で確認したところ、ドメインではなく実際の IP が返されました。次に、PTR レコードがあると確信している IP を確認すると、IP が目覚めました。しかし、エラーが実際にどのように修正されたかは正確にはわかりません。

4

1 に答える 1

1

正直に言うと、未加工のファイル データを爆発させて最善を期待することは、これを達成する最善の方法ではないかもしれません。代わりに、正しい値を確実に抽出できるように、正規表現を使用して必要な正確なデータを抽出するようにしてください。

次のようなことを試してください:

$data = file_get_contents($file);

// This regex matches things that resemble an IP4 address
if (preg_match_all("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z/", $data, $addresses)) {

    foreach ($addresses as $address) {

        // Need to verify it ACTUALLY is a valid IP address
        if (filter_var($address, FILTER_VALIDATE_IP)) { 

            echo gethostbyaddr($address);

        }

    }

}

注: ここで使用されている正規表現は、@alex によって書かれたものです: Regex to match an IP address

これで問題が解決しない場合は、構成の問題である可能性があります。トラブルシューティングに役立つその他の確認事項は次のとおりです。

  • gethostbyaddr('127.0.0.1');同じエラーをスローしますか?
  • DNS 要求の通過を妨げるファイアウォールはありますか?
  • digサーバーからのコマンドを使用して、IP でルックアップを発行できますか?
于 2016-07-27T18:48:54.893 に答える