【问题标题】:PHP cURL With a Loop带循环的 PHP cURL
【发布时间】:2016-11-18 20:17:43
【问题描述】:

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

我在完成此操作时遇到问题,因为一旦看到返回的变量,我就无法循环备份。

$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 变量。有没有人有任何想法?

【问题讨论】:

  • do while 循环怎么样?我相信这会完全满足您的要求。

标签: php api curl


【解决方案1】:

为什么不

$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;
    }
}

【讨论】:

    【解决方案2】:

    我确实喜欢递归函数方法:

    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, []);
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 2023-03-21
    • 2014-12-28
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多