【问题标题】:Calling API inside the loop using php使用php在循环内调用API
【发布时间】:2021-01-29 15:43:01
【问题描述】:

我正在寻找在循环内调用 API 的任何最佳和最快的方法,例如下面是我当前的代码,但我认为这不是好方法,因为这样 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);
    
    }

【问题讨论】:

  • 为什么要提交这么多?它可能会在某个时候拒绝您的请求。
  • 你确定while($sql_f = sqlsrv_fetch_array($sql_q)){
  • 这取决于 API 支持什么。如果你的 API 只支持这种参数化,我看不出有什么办法可以发送大量请求。
  • while 循环运行良好,即使 API 也运行良好,但我担心的是加载速度,我很确定这是因为我在循环内调用 API。如果我错了,请纠正我。
  • 通常 API 具有某种过滤功能,我的建议是检查您正在使用的 API 的文档,并通过 1 个请求或几个请求(使用偏移量,页或其他)...如果您从数据库中获得 2000 条记录怎么办?您将向 API 发出 2000 个请求?这似乎根本不对

标签: php loops curl while-loop


【解决方案1】:

需要设置调度机制

例如:

  1. 创建要传递给 API 的 ID 队列(可以使用 MySQL 表)
  2. 编写一个脚本,从队列中取出第一项并进行 API 调用。
  3. 通话结束后,从队列中移除 ID 或将其标记为完成
  4. 使用例如cron 来安排脚本被调用的频率
  5. 根据您的业务逻辑创建另一个管理队列的脚本

【讨论】:

  • 感谢您的回答,但我正在调用 API 来检查状态而不是更新状态,所以我猜 cron 作业无济于事。
  • 换句话说,我正在显示用户列表及其状态。和来自 API 的状态,所以每当我运行此代码时,我都希望看到所有用户的状态,而不是等待 cron 作业。
  • 异步检查状态并在用户列表中显示最后一个已知状态如何?如果状态检查是一项昂贵的操作,您应该找到尽量减少使用它的方法。例如通过在本地缓存状态、根据特定请求更新状态、创建另一个可以批量返回状态的 API 等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
  • 2021-09-18
  • 1970-01-01
  • 2020-01-14
  • 1970-01-01
相关资源
最近更新 更多