在PHP中的while循环中递归

时间:2013-05-26 08:18:12

标签: php curl recursion proxy

我有一个来自数据库的客户列表,对于每个客户端,我需要使用curl从我的列表中使用随机代理IP从网站获取数据。递归函数尝试使用ip抓取html,如果ip不起作用/太慢,我想跳过ip并抓取另一个随机ip,直到我从网站获取客户端数据然后继续进行另一个客户等等。

目前的问题是,如果ip不起作用,递归函数似乎跳过客户端记录并迭代到下一个客户端记录而不递归。非常感谢能够在这里阐明一些亮点的人。谢谢你提前。

$sql = mysql_query( 'SELECT * FROM client' );

while( $row = mysql_fetch_array( $sql ) ) {
    $fields = array( 'clientID' => $row['clientID'] );

    $fields_string = '';
    foreach($fields as $key=>$value) { $fields_string .= urlencode($key).'='.urlencode($value).'&'; }
    rtrim($fields_string,'&');

    $result = getHTML( $row['url'], $fields_string ); //  call to recursive function
    var_dump($result);
}

$proxy = json_decode(file_get_contents('array2.json'), true);

function getHTML( $url, $fields_string ) {
    global $proxy;

    $randKey = array_rand( $proxy );
    $ip = $proxy[$randKey];

    $ch = curl_init( );
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_PROXY, $ip );
    curl_setopt($ch, CURLOPT_POST, true );
    curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10 );
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $result = curl_exec($ch);
    curl_close($ch);

    if( !$result || !stristr( $result, '<span class="title">' ) ) {
        flush( );
        ob_flush( );
        echo $ip . '<br>'; // just for debugging
        getHTML( $url, $fields_string ); // recursion happen here
    }
    else {
        return $result;
    }
}

1 个答案:

答案 0 :(得分:1)

当getHTML返回一个值时,你应return getHTML(...),以便终端结果到达原始调用者。