API请求限制的解决方法

时间:2014-07-09 14:29:22

标签: php wordpress

我在开发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瞬态中。如果你们需要它我可以包含代码,但是为了这个例子的目的,插件的那部分正在工作,所以我没有包含它。

2 个答案:

答案 0 :(得分:2)

我为这些家伙想出了一个解决方案,我之前应该想到它。因此,我得出的结论是,在当前速率限制下,根据激活下载所有API数据根本不可能。大多数可能使用插件的人会有太多的广告系列来同时下载他们的所有数据,如果我保留代码,大多数情况下速率限制将被用完是不可避免的。它的方式。因此,我不是在激活后立即为插件准备好API数据,而是让用户能够根据需要使用AJAX按需进行API调用。所以让我解释一下它是如何工作的。

首先,在插件激活时,最初不会下载任何数据,并且用户需要输入他们的API凭据,插件将验证它们并在凭据有效且API时给它们一个复选标记登录成功。它使用一个API请求。

现在,而不是在"添加产品"上预先填充广告系列列表。管理页面,用户只需点击"添加产品"用于制作AJAX campaign_find_active请求的页面,该请求将获取广告系列ID并返回广告系列ID和名称的下拉菜单。只使用一个请求。

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

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

总的来说,我只使用了3-4个API请求。我也可以在其中构建一个计数器,这样如果用户一次使用太多请求,我就会向用户显示错误消息。 " API已达到每分钟10个请求的限制,请等待60秒再试一次。"

我欢迎任何评论,建议或批评。希望这可以帮助那些挣扎于API请求限制的人,如果你不介意给予用户更多的控制权,那么AJAX是解决这个问题的好方法。

答案 1 :(得分: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];