3

1 から 200 までのいくつかのページを取得するためにマルチ カールを使用します。問題は、リストからの最初のリンクが常に空を返すことです。理由がわかりません!! O_o

$mh = curl_multi_init();

for($j=0; $j<$i; $j++){
    $ch[$j] = curl_init($Links[$j]);
    curl_setopt($ch[$j], CURLOPT_CONNECTTIMEOUT, $curlConTimeOut);
    curl_setopt($ch[$j], CURLOPT_TIMEOUT, $curlTimeOut);
    curl_setopt($ch[$j], CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch[$j], CURLOPT_MAXREDIRS, 3);
    curl_setopt($ch[$j], CURLOPT_FOLLOWLOCATION, 1);
    curl_multi_add_handle($mh, $ch[$j]);
}

$active = null;
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) != -1) {
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}
$Si = 0; $Fi = 0; $Disp = "";
for($j=0; $j<$i; $j++){
    if($ch[$j]){
        if(curl_multi_getcontent($ch[$j]) == null){
            $Disp .= '0';
            $Fi++;
        }else{
            $Disp .= '1';
            $Si++;
        }           
        curl_multi_remove_handle($mh, $ch[$j]);
        curl_close($ch[$j]);
    }
}
curl_multi_close($mh);

$Si / $Fi / $Disp はテスト用であり、結果の例は次のとおりです。

リンク成功: 65/161

リンク失敗: 96/161

Disp: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111101111110011111111001111111111111111111111111111111111

0 は失敗、1 は成功です。N 要素が 0 の場合、N リンクが NULL を返すことを意味します。

毎回、イニシャル要素だけが null を返すことはありえません!! オッズは何ですか?!?!?! curl_error を要求しましたが、すべて「XXXXX ミリ秒後に接続がタイムアウトしました」!

1°: 13852 ミリ秒

2°: 13833 ミリ秒 ... 12676 ミリ秒 ... 10195 ... 6007 ミリ秒まで続き、その後正しいものを開始します!

CURLOPT_CONNECTTIMEOUT は 6 秒に設定されています!

なぜ毎回より高い数字から始めて6に行き、戻った後は正しいのですか? O_o null 応答の順序はリストのみに依存することを強調したいと思います! マルチカールタイムレスからじゃない!

リンクの少ない別の例:

| | リンク成功: 30/52

| | リンク失敗: 22/52

| | 表示: 00000000000000000000111111111101111111111111111111

4

1 に答える 1