我有一个来自数据库的客户列表,对于每个客户端,我需要使用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;
}
}
答案 0 :(得分:1)
当getHTML返回一个值时,你应return getHTML(...)
,以便终端结果到达原始调用者。