Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用php在循环内调用API_Php_Loops_Curl_While Loop - Fatal编程技术网

使用php在循环内调用API

使用php在循环内调用API,php,loops,curl,while-loop,Php,Loops,Curl,While Loop,我正在寻找在循环内调用API的最佳和最快的方法,例如,bellow是我当前的代码,但我认为这不是一个好方法,因为在这种方式下,API被调用的时间是100秒,因为它在php循环下。有什么我可以在外面用的吗?但问题是我必须传递一些唯一的值,这些值只在循环中 $sql_q = sqlsrv_query($mssql, "SELECT * FROM Table WHERE Club='123'"); while($sql_f = sqlsrv_fetch_array($sql_

我正在寻找在循环内调用API的最佳和最快的方法,例如,bellow是我当前的代码,但我认为这不是一个好方法,因为在这种方式下,API被调用的时间是100秒,因为它在php循环下。有什么我可以在外面用的吗?但问题是我必须传递一些唯一的值,这些值只在循环中

$sql_q = sqlsrv_query($mssql, "SELECT * FROM Table WHERE Club='123'");
   while($sql_f = sqlsrv_fetch_array($sql_q)){
        
    / Calling API TO Check Status
    $auth = curl_init();
    curl_setopt_array($auth, array(
    CURLOPT_URL => "http://api.checkstatus.com/apiurl",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 0,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_POSTFIELDS =>"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\r\n  <soap:Body>\r\n    <CheckStatus xmlns=\"http://apiurl.info/\">\r\n      <UserID>".$ql_f['ID']."</UserID>\r\n </CheckStatus >\r\n  </soap:Body>\r\n</soap:Envelope>",
    CURLOPT_HTTPHEADER => array(
    "Content-Type: text/xml"
    ),
    ));
    $authres = curl_exec($auth);
    curl_close($auth);
    
    }
$sql\u q=sqlsrv\u查询($mssql,“从Club='123'所在的表中选择*);
而($sql\u f=sqlsrv\u fetch\u数组($sql\u q)){
/调用API检查状态
$auth=curl_init();
curl_setopt_数组($auth,数组(
CURLOPT_URL=>”http://api.checkstatus.com/apiurl",
CURLOPT_RETURNTRANSFER=>true,
CURLOPT_编码=>“”,
CURLOPT_MAXREDIRS=>10,
CULLOPT_超时=>0,
CURLOPT_FOLLOWLOCATION=>true,
CURLOPT_HTTP_VERSION=>CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST=>“POST”,
CURLOPT\u POSTFIELDS=>“\r\n\r\n\r\n”。$ql\u f['ID']。”\r\n\r\n\r\n“,
CURLOPT_HTTPHEADER=>数组(
“内容类型:文本/xml”
),
));
$authres=curl\u exec($auth);
卷曲关闭($auth);
}

您需要设置一个调度机制

例如:

  • 创建要传递给API的ID队列(MySQL表就可以了)
  • 编写一个脚本,从队列中获取第一项并进行API调用
  • 调用后,从队列中删除ID或将其标记为已完成
  • 例如,使用cron来计划调用脚本的频率
  • 创建另一个根据业务逻辑管理队列的脚本

  • 您需要设置一个调度机制

    例如:

  • 创建要传递给API的ID队列(MySQL表就可以了)
  • 编写一个脚本,从队列中获取第一项并进行API调用
  • 调用后,从队列中删除ID或将其标记为已完成
  • 例如,使用cron来计划调用脚本的频率
  • 创建另一个根据业务逻辑管理队列的脚本

  • 你为什么要提交这么多?它可能会在某个时候拒绝您的请求。您确定
    while($sql\u f=sqlsrv\u fetch\u array($sql\u q))吗{
    这取决于API支持什么。如果您的API只支持此参数化,我看不出有任何方法可以发送大量请求。虽然循环工作正常,甚至API也工作正常,但我担心的是加载速度,我很确定这是因为我在循环内调用API。如果我错了,请纠正我。通常API具有某种过滤功能,我的建议是检查您正在使用的API的文档,并通过一个或两个请求(使用偏移量、页面或其他方式)获取所需的所有数据…如果您从数据库中获得2000条记录会怎么样?您将向API发出2000条请求?这似乎根本不正确。为什么您必须提交这么多?它可能会在某个时候拒绝您的请求。您确定($sql\U f=sqlsrv\U fetch\U array($sql\U q))时
    while吗{
    这取决于API支持什么。如果您的API只支持此参数化,我看不出有任何方法可以发送大量请求。虽然循环工作正常,甚至API也工作正常,但我担心的是加载速度,我很确定这是因为我在循环内调用API。如果我错了,请纠正我。通常API具有某种过滤功能,我的建议是检查您正在使用的API的文档,并通过一个或两个请求(使用偏移量、页面或其他方式)获取所需的所有数据…如果你从数据库中获得2000条记录会怎么样?你会向API发出2000条请求?这似乎完全不正确谢谢你的回答,但我调用API是为了检查状态,而不是更新状态,所以cron job对我来说帮不了忙。换句话说,我显示了一个用户列表及其状态。状态来自API,所以当r我运行此代码时,我希望看到所有用户的状态,而不是等待cron作业。异步检查状态并在用户列表中显示最后一个已知状态如何?如果状态检查是一项昂贵的操作,您应该找到方法将其使用降到最低。例如,通过在本地缓存状态,根据需要更新状态具体请求,创建另一个可以批量返回状态的API,等等。感谢您的回答,但我调用API是为了检查状态,而不是更新状态,所以cron job不会帮我猜。换句话说,我显示用户列表及其状态。状态来自API,所以每当我运行此代码时,我都希望看到所有用户使用它们的状态,而不是等待cron作业。异步检查状态并在用户列表中显示最后一个已知状态如何?如果状态检查是一项昂贵的操作,您应该找到方法来最小化它的使用。例如,通过在本地缓存状态、根据特定请求更新状态、创建另一个API来批量退货状态等。