2015-12-23 6 views
-1

Я работаю с прокси. По какой-либо причине, если прокси-сервер терпит неудачу, и я предполагаю это, если возвращается 403; Я хотел бы заменить прокси другим (из массива). Я уверен в том, как реализовать его. Предположим, что существует массив прокси в верхней части функции называемые проксиПерезапустите функцию PHP со значением возвращаемой переменной

public static function get_http_response_code($url, &$redirect = null, $proxy = '23.244.68.94:80') { 
    if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i", $url)) return false; 

    if (!is_null($proxy)){ 

     $useragent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36"; 
     $ch = curl_init(); 

     curl_setopt($ch, CURLOPT_PROXY, $proxy); 
     curl_setopt($ch, CURLOPT_USERAGENT, $useragent); 
     curl_setopt($ch, CURLOPT_URL, $url); 
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
     curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1); 
     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($ch, CURLOPT_VERBOSE, 1); 
     curl_setopt($ch, CURLOPT_HEADER, 1); 
     $header = curl_exec($ch); 
     curl_close($ch); 
    } 

    // Pattern to find the status code 
    $codepattern = '/[0-9]{3}/'; 
    preg_match($codepattern, $header, $codematch); 

    // Pattern to find the redirect link 
    $linkpattern = '/https?:\/\/(.+)\//'; 
    preg_match($linkpattern, $header, $linkmatch); 

    // Store results in an array 
    $statuscode = (array_values($codematch)[0]); 
    // Store the redirect link in the $redirect variable 
    if ($statuscode == 301 || $statuscode == 302 || $statuscode == 303) { 
     if (strpos(array_values($linkmatch)[0], 'http') !== false) { 
      $redirect = array_values($linkmatch)[0]; 
     } else { 

     } 
    } 

    return $statuscode; 
} 

$statuscode будет возвращающие код. Если это 403, я хотел бы получить следующий прокси из массива и перезапустить функцию. Я думал делать $proxy = next($proxies); но просто не знает, куда добавить этот

+1

сделать его статическим. – Rizier123

+1

[Рекурсивные функции] (http://stackoverflow.com/questions/2648968/what-is-a-recursive-function-in-php) – ODelibalta

+0

Будьте осторожны с функциями, которые вызывают себя. – crmpicco

ответ

0

Я думаю, лучшим решением может быть просто использовать функцию в пределах foreach цикла:

$proxies = array(/*with stuff in it*/); 
$url = 'my url'; 
$redirect = null; 

foreach ($proxies as $proxy) { 
    $statuscode = get_http_response_code($url, $redirect, $proxy); 

    // If successful, break out of the foreach loop. 
    // Otherwise, the loop will continue to the next proxy. 
    if ($statuscode != 403) 
     break; 
} 
+0

Именно то, что я искал, я ценю помощника! Извинения за раннее замешательство! – Nouman

-1
$name = "Adam"; 
$break = 0; 
function add_y($name, $break) { 
    echo $name . " is 22 years old"; 
    $name .= "y"; 
    /* we need to check a condition so that function dont run for infinite time so we used $break variable and after calling add_y five time we get out of the function */ 
    $break++; 
    if ($break == 5) { 
     exit; 
    } 
    add_y($name, $break); 
} 

add_y($name, $break); 

, который когда-либо вниз проголосовал пожалуйста, укажите причину, так что я может быть осторожным в следующий раз. ?

+0

Согласен, пожалуйста, объясните, что такое downvote, особенно для нового участника. – mopo922

0

Хорошо, когда я начал отвечать на этот вопрос, было задано нечто совершенно другое, как это было в примере. Поэтому мой ответ больше недействителен, но он может содержать полезную информацию для вас, поэтому я все равно оставляю ее здесь.

Как мне кажется, ваша проблема связана с проблемой. Поскольку $ name является локальным для вашей функции, оно возвращается к его значению, как определено вне функции, поскольку переменная, локальная для функции, уничтожается, когда функция заканчивается.

В приведенном ниже примере $ name превращает глобальную переменную в функцию и, таким образом, сохраняет свое значение вне функции при изменении внутри нее.

function addtekst() { 
    global $name; 
    $name = $name . "y"; 
} 
$name = "Adam"; 
echo $name . " is 22 years old"; 
addtekst(); 
addtekst(); 
echo "<br>" . $name . " is 22 years old"; 

Выходы:
Adam 22 лет
Adamyy составляет 22 лет

Когда дело доходит до вашего текущего вопроса, я предлагаю вам идти с решением, предоставленной mopo922.

+0

Спасибо за вклад Ван Дорстен, извинения за раннее замешательство! – Nouman

Смежные вопросы