PHP cURL http 200,等待并运行新的URL

时间:2018-05-21 10:38:47

标签: php http curl wait

必须修改现有代码以使用新的异步API调用。原始文件使用cURL发送请求并使用结果。新方法要求我发送初始化请求,等待10-20秒或直到http 200返回,然后发送查询cURL并使用结果,但不是在检查状态是“已完成”之前。

我很高兴看到cURL,并且努力想要了解与之相关的许多帖子,欢迎任何帮助。代码是:

function check_boomi($service_id) {
$status="";

初始化新的北向API调用

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://testurl.com/init? 
ServiceID=".$service_id."");

在运行'查询'

之前,请等待http 200响应
sleep(20);
$result = curl_exec($ch);

运行北向API查询

curl_setopt($ch, CURLOPT_URL, "http://testurl.com/query? 
ServiceID=".$service_id."");

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
$headers = array();
$headers[] = "Cache-Control: no-cache";
$headers[] = "Postman-Token: d2d57c3e-7c5d-df1b-4b61-dacb6c44b7cg";
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
} 

检查结果'状态':

如果'处理'等待20秒再试一次 如果'已完成'使用返回数据

curl_close ($ch);
$data = json_decode($result);
return $data;}

1 个答案:

答案 0 :(得分:0)

我省略了一些行,因此您可以更好地概述逻辑,并将代码分成两个方法:

  • initApi - 调用初始化api请求并等待最多20秒的响应
  • runQuery - 调用查询api请求 - 在可用时返回数据,否则等待例如20秒再试一次

    //set max execution time to e.g. 2 minutes
    ini_set('max_execution_time', 120);
    
    initApi($service_id);
    $data = runQuery();
    
    function initApi($service_id){
        $ch = curl_init();
        //set init-url and all relevant curl headers
        curl_setopt($ch, CURLOPT_URL, "http://testurl.com/init?ServiceID=".$service_id."");
        //set request timeout to 20 seconds - when taking longer we check with runQuery
        curl_setopt($ch, CURLOPT_TIMEOUT, 20)
    
        $result = curl_exec($ch);
    }
    
    function runQuery(){
        $ch = curl_init();
        //set query url and all relevant headers
    
        $result = curl_exec($ch);
        if (!curl_errno($ch)) {
            //check the response if it's still "processing" or "completed" - i'm not sure how the api returns that
            $status = 
            if($status == "processing") {
                //wait for 20 seconds and call query again
                sleep(20);
                return runQuery();
            }
            else{
                //return data
            }
        }
    }
    

您还可以减少睡眠超时 - 然后更频繁地调用查询并检查结果是否可用(我假设查询请求没有阻塞)

并且不要忘记设置max_execution_time - 默认值可能是30秒 - 如果您的脚本运行时间更长,请求将失败。