小赖子的英国生活和资讯

PHP 中 Rate Limit 的简单实现

阅读 桌面完整版

现在很多大型网站(像FB,TWITTER)都 提供 API接口.一般返回格式是JSON. 一般会限制每IP地址访问的频率 比如每小时 600次调用等等.

如果你想提供一个API 但是计算又挺耗时的不想用户频繁的调用,可以通过记录上次调用时间来限制,比如:

1
2
3
  $data = "Data Returned from API";
  header('Content-Type: application/json');
  die(json_encode($data)); 
  $data = "Data Returned from API";
  header('Content-Type: application/json');
  die(json_encode($data)); 

然后我们就可以在 session 中记录时间来判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  session_start();
  if (isset($_SESSION['LAST_CALL'])) {
    $last = strtotime($_SESSION['LAST_CALL']);
    $curr = strtotime(date("Y-m-d h:i:s"));
    $sec =  abs($last - $curr);
    if ($sec < = 1) {
      $data = 'Rate Limit Exceeded';  // 调用太频繁了
      header('Content-Type: application/json');
      die (json_encode($data));        
    }
  }
  $_SESSION['LAST_CALL'] = date("Y-m-d h:i:s");
 
  // 正常使用
  $data = "Data Returned from API";
  header('Content-Type: application/json');
  die(json_encode($data)); 
  session_start();
  if (isset($_SESSION['LAST_CALL'])) {
    $last = strtotime($_SESSION['LAST_CALL']);
    $curr = strtotime(date("Y-m-d h:i:s"));
    $sec =  abs($last - $curr);
    if ($sec < = 1) {
      $data = 'Rate Limit Exceeded';  // 调用太频繁了
      header('Content-Type: application/json');
      die (json_encode($data));        
    }
  }
  $_SESSION['LAST_CALL'] = date("Y-m-d h:i:s");

  // 正常使用
  $data = "Data Returned from API";
  header('Content-Type: application/json');
  die(json_encode($data)); 

建议把上面的代码 提取到外面单独的一个PHP头文件中然后 放在每个API调用的文件开始 (因为需要初始化 session_start())

1
require_once('rate.php');
require_once('rate.php');

英文:Easy Rate Limit in PHP using Simple Strategy – An API Example

强烈推荐

微信公众号: 小赖子的英国生活和资讯 JustYYUK

阅读 桌面完整版
Exit mobile version