9

Web サイトの HTTP ステータスをできるだけ早くチェックする PHP スクリプトを作成しようとしています。

私は現在 get_headers() を使用しており、mysql データベースからの 200 個のランダムな URL のループで実行しています。

200 件すべてをチェックするには、平均 2 分 48 秒かかります。

それを(はるかに)速くするためにできることはありますか?

(私は fsockopen について知っています - 20 秒で 200 のサイトのポート 80 をチェックできます - しかし、サーバーがポートで応答する可能性があるため、http ステータス コードを要求するのと同じではありません - しかし、ウェブサイトを正しくロードしていない可能性があります)

これがコードです..

<?php
  function get_httpcode($url) {
    $headers = get_headers($url, 0);
    // Return http status code
    return substr($headers[0], 9, 3);
  }

  ###
  ## Grab task and execute it
  ###


    // Loop through task
    while($data = mysql_fetch_assoc($sql)):

      $result = get_httpcode('http://'.$data['url']);   
      echo $data['url'].' = '.$result.'<br/>';

    endwhile;
?>
4

2 に答える 2

10

CURL ライブラリを試すことができます。CURL_MULTI_EXECで複数のリクエストを同時に送信できます

例:

$ch = curl_init('http_url'); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
$c = curl_exec($ch); 
$info = curl_getinfo($ch, CURLINFO_HTTP_CODE);
print_r($info);

更新しました

この例を見てください。http://www.codediesel.com/php/parallel-curl-execution/

于 2012-04-01T12:07:39.757 に答える
4

これが検討できるオプションかどうかはわかりませんが、フォークを使用してそれらすべてをほぼ同時に実行できます。この方法では、スクリプトは1回のリクエストより少しだけ長くかかります http://www.php .net/manual/en/function.pcntl-fork.php

たとえば、これを cli モードで実行されるスクリプトに追加して、すべてのリクエストを同時に起動することができます。

編集: 200回の呼び出しがあると言うので、データベース接続が失われる可能性があります。この問題は、最初のスクリプトが完了するとリンクが破棄されるために発生します。子ごとに新しい接続を作成することを避けるためです。標準の mysql_* 関数を使用しているようですので、必ず 4 番目のパラメーターを渡して、毎回新しいリンクを作成するようにしてください。サーバーの最大同時接続数も確認してください

于 2012-04-01T12:13:24.027 に答える