1

我有一个来自数据库的客户列表,对于每个客户,我需要使用 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;
    }
}
4

1 回答 1

1

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

于 2013-05-26T08:32:26.583 回答