使用返回变量的值重新启动PHP函数

时间:2015-12-23 15:30:56

标签: php function curl proxy

我正在使用代理。无论出于何种原因,假设代理失败,我假设这是403,如果返回;我想用另一个代理(从数组)替换代理。我不确定如何实现它。假设在函数顶部有一个代理数组,名为proxies

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);,但只是不确定在哪里添加这个

3 个答案:

答案 0 :(得分: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提供的解决方案。

答案 1 :(得分: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;
}

答案 2 :(得分:-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);
那些投票的人请说明原因,以便下次我可能会小心。 ?