【问题标题】:How to gracefully handle a downed API如何优雅地处理宕机的 API
【发布时间】:2010-11-03 12:03:02
【问题描述】:

由于今天 twitter 宕机,我一直在思考如何在它宕机时最好地处理对 API 的调用。如果我使用 CURL 调用他们的 api,我如何使脚本快速失败并处理错误,以免降低应用程序的速度?

【问题讨论】:

    标签: php api curl


    【解决方案1】:

    使用curl_setopt

    curl_setopt($yourCurlHandle, CURLOPT_CONNECTTIMEOUT, '1'); // 1 second
    

    如果您使用 curl >= 7.16.2 和 PHP >= 5.2.3,则有 CURLOPT_CONNECTTIMEOUT_MS

    【讨论】:

    • 唯一的问题是它无法区分慢速连接和关闭的 api。
    • 如果超时会返回 true 吗?
    • 一个非常慢的连接就像一个被关闭的 API 一样糟糕。不过,也许 3+ 秒是一个更慷慨的超时。
    • 只是为了提供更多细节(re: 如何使用它来优雅地失败),curl_exec 如果超时将返回 false 并且 true 如果它收到响应 - 或者,如果您将 CURLOPT_RETURNTRANSFER 选项设置为 true,它将返回结果本身。无论哪种方式,您都可以在控制结构中使用它,例如:if ($result = curl_exec($resource)) { ... } else { ... }
    【解决方案2】:

    使用 curl_getinfo 获取 cURL 响应代码或内容长度并检查这些内容。

    $HttpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    

    【讨论】:

    • 我实际上决定结合返回的代码和运行 chron 作业以检查站点状态的其他答案。
    【解决方案3】:

    也许使用一种缓存来判断 twitter 是打开还是关闭。在数据库或服务器端文件中记录来自 api 的无效响应。一旦您连续收到两个/三个/一些其他数量的无效响应,请在 x 时间内禁用对 api 的所有请求。

    在 x 时间后,尝试请求,如果仍然关闭,请再次禁用 x 分钟。

    如果您的服务器可以运行 CRON 作业,请考虑制作一个脚本,每隔几分钟检查一次 API 是否有有效响应。如果它发现它已关闭,请禁用请求,直到它备份。至少在这种情况下,服务器将进行测试,用户不必成为豚鼠。

    【讨论】:

      猜你喜欢
      • 2015-12-14
      • 2011-11-26
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      • 2014-07-10
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多