PHP - curl_multi проверить ответ через прокси - PullRequest
0 голосов
/ 06 ноября 2019

Привет, ребята, у меня проблема при попытке проверить, жив прокси-сервер или нет. При использовании обычного curl_exec () у меня нет проблем, но это занимает слишком много времени. Когда вы пытаетесь использовать curl_multi_exec и печатаете результат, он печатает пустой результат из запроса, который я делаю через прокси. Кто-нибудь пытался выполнить проверку прокси с несколькими curl (если несколько прокси-серверов живы или мертвы), используя curl_multi_exec (), и вы видите какую-то проблему в моем коде?

<?php

function checkProxyList_multi($proxy_list, $timeout) {
    $proxies = $proxy_list; // Get each proxy
    $checked_proxy = array(); // Array containing checked proxies
    $mh = curl_multi_init();
    $j = 0;

    for($i = 0; $i < count($proxies) - 1; $i++) {
        if(!in_array($proxies[$i], $checked_proxy)) { // If we didn't checked that proxy, check it
            $checked_proxy[$j] = $proxies[$i];
            $ch[$j] = curl_init("http://google.com");
            curl_setopt($ch[$j], CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch[$j], CURLOPT_TIMEOUT, $timeout);
            curl_setopt($ch[$j], CURLOPT_CONNECTTIMEOUT, $timeout);
            curl_setopt($ch[$j], CURLOPT_PROXY, $proxies[$i]);
            curl_setopt($ch[$j], CURLOPT_NOBODY, true);
            curl_multi_add_handle($mh, $ch[$j]);
            $j++;
        }
    }

    do {
        $execReturnValue = curl_multi_exec($mh, $runningHandles);
    } while ($execReturnValue == CURLM_CALL_MULTI_PERFORM);

    // Loop and continue processing the request
    while ($runningHandles && $execReturnValue == CURLM_OK) {
        if (curl_multi_select($mh) != -1) {
            usleep(1000);
        }
        do {
            $execReturnValue = curl_multi_exec($mh, $runningHandles);
        } while ($execReturnValue == CURLM_CALL_MULTI_PERFORM);
    }

    // Check for any errors
    if ($execReturnValue != CURLM_OK) {
        echo "Curl multi read error $execReturnValue\n";
    }

    // Extract the content
    foreach($checked_proxy as $i => $url) {
        // Check for errors
        $curlError = curl_error($ch[$i]);

        if ($curlError == "") {
            $res[$i] = curl_multi_getcontent($ch[$i]);
        } else {
            echo "Curl error on handle $i: $curlError\n";
        }
        // Remove and close the handle
        curl_multi_remove_handle($mh, $ch[$i]);
        curl_close($ch[$i]);
    }

    // Clean up the curl_multi handle
    curl_multi_close($mh);

    // Print the response data
    print_r($res);
}

$proxy_list = array(
    '103.242.13.69:8082',
    '103.67.165.62:8080',
    '103.251.225.4:35101',
    '104.148.46.2:3121',
    '107.179.7.2:3129',
    '104.236.54.196:8080',
);

checkProxyList_multi($proxy_list, 10);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...