【问题标题】:How to limit external API calls from PHP app如何限制来自 PHP 应用程序的外部 API 调用
【发布时间】:2020-01-01 03:57:51
【问题描述】:

我有一个 PHP 应用程序使外部 API 过载,每分钟调用次数过多。我需要将其限制为每分钟仅 20 个呼叫,但我似乎无法弄清楚。我研究了这个问题并找到了thisthat,但是缺少适当的文档,我不知道它是如何工作的。我知道这被称为“速率限制”,但我想我在学校跳过了它。

我的应用只是循环发送 cURL 请求。我在程序中运行了几个循环来收集所有这些信息。我可以用一个计时器将一个循环限制为每分钟 20 个,但我有 17 个循环正在运行,并且我在循环中有循环。是否可以使用单个帮助程序或其他东西来限制我的 PHP 应用程序中的所有 cURL 请求而不编辑我的所有代码?

【问题讨论】:

    标签: php api loops web rate-limiting


    【解决方案1】:

    没有办法限制使用任何内置功能的 PHP 函数。您可以编写一些简单的包装器,它每分钟仅调用 API 给定的次数。一个粗略的示例如下所示:

    function callAPI($api) {
        static $lastRequest;
        $maxRequestsPerMin = 20;
        if (isset($lastRequest)) {
            $delay = 60 / $maxRequestsPerMin; // 60 seconds / $maxRequestsPerMin
            if ((microtime(true) - $lastRequest) < $delay) {
                // Sleep until the delay is reached
                $sleepAmount = ($delay - microtime(true) + $lastRequest) * (1000 ** 2);
                usleep($sleepAmount);
            }
        }
        $lastRequest = microtime(true);
    
        // Call you API here
    }
    

    但是,这只会限制此特定脚本的速率。如果您执行另一个,那么您将启动另一个计数器。或者,您可以将一些循环表存储在平面文件或数据库中,并在每次要调用 API 时对其进行检查。

    对于高级用法,您应该查看消息队列或 ReactPHP。如果此类功能会暴露给最终用户,您不希望挂起您的服务器。

    【讨论】:

    • 这实际上是我最终做的,但感谢让其他人知道!
    猜你喜欢
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 2013-07-11
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多