【问题标题】:Workaround for API Request LimitAPI 请求限制的解决方法
【发布时间】:2014-07-09 14:29:22
【问题描述】:

我在开发 Wordpress 插件时遇到了问题。基本上,我正在构建插件的 API 将我需要发出的请求限制为每分钟 6 个,但是当插件激活时,我需要发出超过 6 个请求来下载插件所需的 API 数据 -在。

API 是 LimelightCRM API (http://help.limelightcrm.com/entries/317874-Membership-API-Documentation)。我正在使用 API 的 campaign_view 方法,我想做的可能是批量发出请求,但我不太确定如何解决这个问题。

想法 1: 就在我的脑海中,我想我需要使用campaign_find_active 计算我需要在插件激活时使用 PHP 发出的请求数,然后将该计数除以请求限制(6),然后每分钟发出 6 个campaign_view 请求,直到我拥有所需的所有数据并将它们存储在 Wordpress 瞬态中。但是,假设我需要发出 30 个请求,用户不能只是坐等 5 分钟来下载数据。即使我设法为此提出解决方案,也可能需要我设置 Wordpress 瞬态的时间限制,以使插件永远不需要发出超过 6 个请求。所以我的下一个想法是,我可以使用 Wordpress 钩子在检查最后一批请求的时间时经常发出请求吗?所以它已经变得非常棘手。我想知道你们是否能指出我正确的方向。您对我如何能够突破这个速率限制有任何想法吗?

想法 2: 将值存储在数据库中的 Cron 作业?

//Fetch Campaign ID's
$t_campaign_find_active = get_transient('campaign_find_active');
if(!$t_campaign_find_active){
    limelight_cart_campaign_find_active();
    $t_campaign_find_active = get_transient('campaign_find_active');
    return $t_campaign_find_active;
}

//Fetch Campaign Information for each Campaign ID
$llc_cnames = array();
foreach($llc_cids as $count => $id) {
    if(!get_transient('campaign_view_'.$id)) {
        limelight_cart_campaign_view($id);
        $llc_cnames[$id] = get_transient('campaign_view_'.$id);
    }
}

//Merge Campaign ID's and Campaign Info into Key => Value array
$limelight_campaigns = array_combine($llc_cids, $llc_cnames);

注意:函数 limelight_cart_campaign_find_active() 和 limelight_cart_campaign_view() 不包括在内,因为它们只是发出单个 API 请求、返回响应并将其存储在 Wordpress 瞬态中。如果你们需要,我可以包含代码,但出于本示例的目的,插件的那部分是有效的,所以我没有包含它。

【问题讨论】:

  • 想法 3 - 联系Lime Light CRM support 并了解可以做什么。有时我们已经习惯了黑客攻击,我们忘记了在另一端可能有一个经过批准的现成解决方案的人。

标签: php wordpress


【解决方案1】:

我已经为这些人想出了一个解决方案,而且我之前应该想到过。所以我得出的结论是,在当前的速率限制下,下载所有激活时的 API 数据是根本不可能的。大多数可能使用该插件的人都会有太多的活动来一次下载他们所有的数据,如果我保持代码不变,那么在大多数情况下,速率限制将不可避免地用完。因此,与其在激活后立即为插件准备好 API 数据,不如让用户能够根据需要使用 AJAX 进行 API 调用。所以让我解释一下它是如何工作的。

首先,在插件激活时,最初不会下载任何数据,用户需要输入他们的 API 凭证,插件将对其进行验证,如果凭证有效,API 将给他们打勾登录成功。它使用一个 API 请求。

现在,用户无需在“添加产品”管理页面上预先填充广告系列列表,只需单击“添加产品”页面上的一个按钮即可发出 AJAX campaign_find_active 请求,该请求将获取该广告系列ID 并返回广告系列 ID 和名称的下拉菜单。只使用一个请求。

获取该下拉数据后,他们需要选择要使用的广告系列,在选择广告系列 ID 后,插件将显示另一个按钮以发出 campaign_view 请求以获取广告系列数据与 ID 相关联。这将返回另一个下拉菜单,允许他们选择产品。这还需要一点 CSS 和 jQuery 来根据下拉值显示/隐藏 AJAX 按钮。它将只使用一个 API 请求,并且由于该请求不是自动发出的并且需要单击按钮,因此用户在提取的第一个下拉菜单中选择活动 ID 时不会发出多个 API 请求。

然后,用户将单击发布,并拥有一个 wordpress 索引产品,其中附加并缓存了所有必要的关注数据。所有 API 请求都将存储在具有 1 小时时间限制的瞬态中,并且该小时的原因是他们不必等待 24 小时以防他们进行更新。我还将在设置页面上添加一个按钮来清除瞬变,以便它们可以在必要时按需重新下载。这也可能有点棘手,但就这个问题而言,这不是问题。

总的来说,我只使用了 3-4 个 API 请求。我还可以在其中构建一个计数器,以便在用户一次使用太多请求时向用户显示错误消息。类似于“已达到 API 的每分钟 10 个请求的限制,请等待 60 秒,然后重试。”

我欢迎任何 cmets、建议或批评。希望这可以帮助那些在 API 请求限制方面苦苦挣扎的人,如果您不介意给用户更多控制权,AJAX 是一种很好的解决方法。

【讨论】:

    【解决方案2】:

    我刚刚创建了 40 个 API 帐户,并为每个请求随机选择一个。效果很好

    $api_acounts = array(
        "account1" => "asdfasdfdsaf",
        "account2" => "asaasdfasdf",
        "account3" => "asdfasdf",
    );
    $rand = rand(1,count($api_acounts));
    $username = "account".$rand;
    $password = $api_acounts['account'.$rand];

    【讨论】:

      猜你喜欢
      • 2016-09-03
      • 1970-01-01
      • 2013-10-02
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 2011-10-21
      • 1970-01-01
      相关资源
      最近更新 更多