繁体   English   中英

PHP cURL带循环

[英]PHP cURL With a Loop

我正在尝试集成一个Web服务,其中JSON响应返回下一个1,000个结果的URL。 我要做的是循环cURL以继续处理请求,直到“ next”变量为空。

我遇到了问题,因为一旦看到变量返回,就无法循环备份。

$url = "https://xxxxxxxxxxxxxx.com/process/api/transactions/from/$yesterday/to/$today/for/company/21?offset=0&limit=1000"; 

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);                                                              
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");                                                                                                                                    
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Cookie: $cookie"));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);                                                                                                                                            

$result = curl_exec($ch);

file_put_contents(rj_array, $result, FILE_APPEND);

$server = file_get_contents(rj_array);

$json_result = json_decode($server, true);

$next = $json_result['next'];

我正在考虑做类似的事情:

while(!empty($next)){
//Do the curl request again with the new URL $next
}

但是我不能每次都重置$ next变量。 有人有什么想法吗?

为什么不

$base_url = "https://xxxxxxxxxxxxxx.com/process/api/transactions/from/$yesterday/to/$today/for/company/21?limit=1000";
$next = 0;
while( $next !== false ) {
    $url = $base_url . "&offset=" . $next;

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url);                                                              
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");                                                                                                                                    
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("Cookie: $cookie"));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);                                                                                                                                            

    $result = curl_exec($ch);

    file_put_contents(rj_array, $result, FILE_APPEND);

    $server = file_get_contents(rj_array);

    $json_result = json_decode($server, true);

    $next = $json_result['next'];
    if( /*test if next is empty*/ ) {
        $next = false;
    }
}

我喜欢递归函数方法:

function crawler($url, $return) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("Cookie: $cookie"));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

    $result = curl_exec($ch);

    file_put_contents(rj_array, $result, FILE_APPEND);

    $server = file_get_contents(rj_array);

    $json_result = json_decode($server, true);
    $return[$url] = $json_result; //set your return information in some array

    $next = $json_result['next'];

    if(!empty($next)) {
        return crawler($next, $return); //call again same function with next url and array of data that you would use later
    }

    return $return;
}

$url = "https://xxxxxxxxxxxxxx.com/process/api/transactions/from/$yesterday/to/$today/for/company/21?offset=0&limit=1000";
$allJsonResults = crawler($url, []);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM