15

URL のリストが与えられた場合、各 URL が次のことを確認したいと思います。

  • 200 OK ステータス コードを返す
  • X時間以内に応答を返します

最終的な目標は、管理者が確認できるように、壊れている可能性のある URL にフラグを立てることができるシステムです。

スクリプトは PHP で作成され、ほとんどの場合、cron を介して毎日実行されます。

スクリプトは一度に約 1000 個の URL を処理します。

質問には 2 つの部分があります。

  • このような操作で大きな落とし穴はありますか?どのような問題に遭遇しましたか?
  • 精度とパフォーマンスの両方を考慮して、PHPでURLのステータスをチェックするための最良の方法は何ですか?
4

9 に答える 9

18

PHP cURL 拡張機能を使用します。fopen() とは異なり、URL の可用性を確認するのに十分な HTTP HEAD リクエストを作成することもできます。確認のためにページの本文全体をダウンロードする必要がないため、大量の帯域幅を節約できます。

出発点として、次のような関数を使用できます。

function is_available($url, $timeout = 30) {
    $ch = curl_init(); // get cURL handle

    // set cURL options
    $opts = array(CURLOPT_RETURNTRANSFER => true, // do not output to browser
                  CURLOPT_URL => $url,            // set URL
                  CURLOPT_NOBODY => true,         // do a HEAD request only
                  CURLOPT_TIMEOUT => $timeout);   // set timeout
    curl_setopt_array($ch, $opts); 

    curl_exec($ch); // do it!

    $retval = curl_getinfo($ch, CURLINFO_HTTP_CODE) == 200; // check if HTTP OK

    curl_close($ch); // close handle

    return $retval;
}

ただし、可能な最適化方法はたくさんあります。cURL インスタンスを再利用したり、ホストごとに複数の URL をチェックする場合は、接続を再利用したりすることもできます。

ああ、このコードは HTTP 応答コード 200 を厳密にチェックします。リダイレクト (302) には従いませんが、そのための cURL オプションもあります。

于 2008-10-28T20:11:12.610 に答える
6

cURLを調べてください。PHP用のライブラリがあります。

cURL の実行可能バージョンもあるので、bash でスクリプトを作成することもできます。

于 2008-10-28T19:28:42.837 に答える
4

私は実際に、5k 以上の URL のデータベースに対してこれを行う PHP で何かを書きました。getResponseCode ()というメソッドを持つPEAR クラスのHTTP_Requestを使用しました。URL を反復処理して getResponseCode に渡し、応答を評価するだけです。

ただし、FTP アドレス、http または https で始まらない URL (未確認ですが、そうであると私は信じています)、および無効なセキュリティ証明書 (0 が見つからない) を持つサイトでは機能しません。また、server-not-found の場合は 0 が返されます (そのステータス コードはありません)。

また、いくつかのファイルを含め、単一の関数を使用して整数コードを取得するため、おそらく cURL よりも簡単です。

于 2008-10-28T19:32:37.757 に答える
2
  1. fopen() は http URI をサポートします。
  2. さらに柔軟性が必要な場合 (タイムアウトなど)、cURL 拡張機能を調べてください。
于 2008-10-28T19:28:08.360 に答える
1

200応答を返すだけでは十分ではありません。多くの有効なリンクは、前の所有者が更新に失敗したときにポルノ/ギャンブルポータルに変更された後も「200」を返し続けます。

ドメインスクワッターは通常、ドメイン内のすべてのURLが200を返すことを保証します。

于 2008-10-28T20:25:11.333 に答える
1

別のページにリダイレクトする 301 または 302 HTTP 応答を返す URL にも注意する必要があります。通常、これはリンクが無効であることを意味しません。たとえば、http://amazon.comは 301 を返し、http://www.amazon.com/にリダイレクトします。

于 2008-10-28T20:06:10.717 に答える
1

curlの仕事のようです。

PHP Perl の LWP に行き詰まっていない場合も、答えになるかもしれません。

于 2008-10-28T19:33:47.130 に答える
0

これを行うには、bash スクリプトのみが必要です。こちらの同様の投稿で私の回答を確認してください。これは、HTTP 接続を再利用して速度を劇的に改善し、一時的なエラーに対して n 回再試行し、リダイレクトに従うワンライナーです。

于 2012-07-06T23:24:51.000 に答える
0

間違いなく遭遇する可能性のある問題の 1 つは、このスクリプトを実行しているボックスがインターネットへのアクセスを失った場合です... 1000 の誤検知が発生します。

おそらく、スクリプトで何らかの履歴を保持し、5 日間の失敗後にのみ失敗を報告する方がよいでしょう。

また、スクリプトは、標準のチェックを続行する前に、何らかの方法で自己チェックする必要があります (既知の適切な Web サイト [google?] をチェックするなど)。

于 2008-10-28T19:30:14.067 に答える