Привет, ребята, у меня проблема при попытке проверить, жив прокси-сервер или нет. При использовании обычного 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);