最近我正在用CakePHP编写一个小网页。我的大多数模型都代表必须通过外部API收集的数据,其中HttpSocket
组件提供CakePHP 2.x
。
这是我在AppModel.php
public function get ($url, $options = array()) {
$options += $this->default;
$url .= 'api_key=' . $options['api_key'];
$hs = new HttpSocket();
return $hs->get($url);
}
我想实施一些措施来控制CakePHP调用API的次数,因为它有限制(例如每分钟100个请求,每小时1000个)
实现这一目标的最佳方法是什么?
我在新表中考虑了与请求相关的商店数据,但我不确定我是否可以从AppModel.php
进行查询
谢谢
答案 0 :(得分:0)
我会创建一个像api_call_log
这样的新表并递增计数。您只需在AppModel中获取模型实例:
$ApiCallLog = ClassRegistry::init('ApiCallLog')
$ApiCallLog->log();
将计数的逻辑放入模型方法并根据需要传递参数,不确定您可能还需要什么。
而不是将其放在AppModel中,行为可能是一个更好的地方,您可以在那里实现其他方法以及代码增长并将其仅附加到需要它的模型。
使用Redis缓存的替代方案很可能比使用SQL DB更少资源。因此,使用Cache :: read()和Cache :: write()来获取实际计数并递增它。如果您收到API的A LOT请求,这很可能是更好的选择。如果在计数和递增操作期间未锁定表,则可能会使用SQL DB发生冲突。我从来没有遇到这种情况,但我不会指望它不会发生。
附加说明:get()
是非常通用名称,我会将其重命名为httpGet()
。非特定的名称可能非常混乱,特别是如果其他类中存在相同名称的方法。