3

CURLOPT_CONNECTTIMEOUT と CURLOPT_TIMEOUT が検出されたときに、何かを検出、キャッチ、および実行したい。

これを行うにはどうすればよいですか?

次のヘッダーがあります。

public static $userAgents = array(
    'FireFox3' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9) Gecko/2008052906 Firefox/3.0',
    'GoogleBot' => 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)',
    'IE7' => 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)',
    'Netscape' => 'Mozilla/4.8 [en] (Windows NT 6.0; U)',
    'Opera' => 'Opera/9.25 (Windows NT 6.0; U; en)'
);
public static $options = array(
    CURLOPT_USERAGENT => 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)',
    CURLOPT_AUTOREFERER => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FRESH_CONNECT => true,
    CURLOPT_COOKIEJAR => "cookies.txt",
    CURLOPT_COOKIEFILE => "cookies.txt",
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_CONNECTTIMEOUT => 5,
    CURLOPT_TIMEOUT => 300,
        //CURLOPT_COOKIESESSION => false,
);

$res は、html ファイル名を含む配列です。

public function multiCurl($res, $options = "") {

    if (count($res) <= 0)
        return False;

    $handles = array();

    if (!$options) // add default options
        $options = self::$options;

    // add curl options to each handle
    foreach ($res as $k => $row) {
        $ch{$k} = curl_init();
        $options[CURLOPT_URL] = $row['url'];
        curl_setopt_array($ch{$k}, $options);
        $handles[$k] = $ch{$k};
    }

    $mh = curl_multi_init();

    foreach ($handles as $k => $handle) {
        curl_multi_add_handle($mh, $handle);
    }

    $running_handles = null;
    //execute the handles
    do {
        $status_cme = curl_multi_exec($mh, $running_handles);
    } while ($cme == CURLM_CALL_MULTI_PERFORM);

    while ($running_handles && $status_cme == CURLM_OK) {
        if (curl_multi_select($mh) != -1) {
            do {
                $status_cme = curl_multi_exec($mh, $running_handles);
            } while ($status == CURLM_CALL_MULTI_PERFORM);
        }
    }

    foreach ($res as $k => $row) {
        $res[$k]['error'] = curl_error($handles[$k]);
        if (!empty($res[$k]['error']))
            $res[$k]['data'] = '';
        else {
            //$res[$k]['data'] = curl_multi_getcontent($handles[$k]);  // get results 
            file_put_contents(CRAWLER_FILES . $k . '.html', curl_multi_getcontent($handles[$k]));
        }

        // close current handler
        curl_multi_remove_handle($mh, $handles[$k]);
    }
    curl_multi_close($mh);
    return $res; // return response
}
4

3 に答える 3

3

次の 2 つのオプションがあります。

  1. から返された配列で、 をオプションに使用した値curl_getinfo($ch)と比較します。に使用した値と比較することもできます。ダンプすると、必要なものを推測できる他のタイマーもたくさんあることがわかります。connect_timeCURLOPT_CONNECTTIMEOUTtotal_timeCURLOPT_TIMEOUTcurl_getinfo($ch)
  2. から返された文字列を使用しますcurl_error($ch)。オプションのいずれか*_TIMEOUTがヒットすると、次のような文字列が返されます。

0 バイトの受信で 2001 ミリ秒後に操作がタイムアウトしました

于 2013-02-22T14:28:45.387 に答える
3

リクエストに関する情報を取得するには、curl_getinfoまたはcurl_multi_info_read

そして、それを次のように使用します。

curl_exec($ch);
if(!curl_errno($ch))
{
 $info = curl_getinfo($ch);
 echo 'Took ' . $info['total_time'] . ' seconds to send a request to ' . $info['url'];
}

info 配列では、次のデータを受け取ることができます:

  • 「URL」
  • 「コンテンツタイプ」
  • "http_コード"
  • "header_size"
  • "request_size"
  • 「ファイルタイム」
  • "ssl_verify_result"
  • 「リダイレクト数」
  • "total_time"
  • "namelookup_time"
  • 「接続時間」
  • "pretransfer_time"
  • "size_upload"
  • "size_download"
  • "speed_download"
  • "speed_upload"
  • "download_content_length"
  • "upload_content_length"
  • "starttransfer_time"
  • "redirect_time"
  • 「証明書情報」
  • "request_header" (これは、以前の curl_setopt() の呼び出しによって CURLINFO_HEADER_OUT が設定されている場合にのみ設定されます)
于 2012-08-27T07:56:17.403 に答える