【问题标题】:Cakephp + HttpSocket component + Restful APICakephp + HttpSocket 组件 + Restful API
【发布时间】:2015-02-09 18:58:47
【问题描述】:

最近我正在用 CakePHP 编写一个小型网页。我的大部分模型都表示必须通过外部 API 收集的数据,该 API 使用提供 CakePHP 2.xHttpSocket 组件。

这是我在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 进行查询

谢谢

【问题讨论】:

    标签: php cakephp


    【解决方案1】:

    我会创建一个像api_call_log 这样的新表并增加计数。您可以简单地在 AppModel 中获取模型实例:

    $ApiCallLog = ClassRegistry::init('ApiCallLog')
    $ApiCallLog->log();
    

    将您的计数逻辑放入模型方法并根据需要传递参数,不确定您可能还需要什么。

    与其将它放在 AppModel 中,行为可能是一个更好的地方,您可以在那里实现其他方法以及代码增长并将其仅附加到需要它的模型。

    使用 Redis 缓存很可能比使用 SQL DB 更少占用资源。所以使用 Cache::read() 和 Cache::write() 来获取实际计数并增加它。如果您收到对 API 的很多请求,这很可能是更好的选择。如果在计数和递增操作期间未锁定表,则使用 SQL DB 可能会发生冲突。我从来没有遇到过这种情况,但我不会指望它不会发生。

    附加说明:get() 是一个非常 通用名称,我将其重命名为httpGet()。不具体的名称可能会让人很困惑,尤其是当周围的其他类中有同名的方法时。

    【讨论】:

    • 我将在接下来的几天里尝试这两个选项(数据库和缓存)。 get 方法名称不取决于我,它是 CakePHP 组件的一部分。谢谢你的回答伙伴。
    猜你喜欢
    • 2012-08-15
    • 1970-01-01
    • 2015-02-14
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多