Rate Limiter là một tính năng được tích hợp trong WPSP có nhiệm vụ ngăn chặn request nếu vượt quá giới hạn thiết lập.
Ví dụ:
- Bạn muốn API chỉ được phép truy cập tối đa 10 lần/1 phút cho mỗi địa chỉ IP.
- Bạn muốn Admin Page chỉ được phép truy cập tối đa 10 lần/1 phút cho mỗi user.
Lúc này, Rate Limiter có thể sẽ giúp bạn xử lý được việc đó.
1. Cài đặt lưu trữ
Rate Limiter được cấu hình lưu trữ theo “stores” trong tệp /config/cache.php
Mặc định, Rate Limiter sẽ lưu dữ liệu vào: database được set trong tệp .evn với key: RATE_LIMITER_STORE
Bạn có thể chuyển sang: database, file, memcached, redis.
2. Tạo và cấu hình các Rate Limiter
Tệp tin /config/rate-limiter.php là nơi bạn sẽ tạo ra và cấu hình các Rate Limiter.
Mục đích là để bạn có thể dễ dàng nhóm các Request nào sẽ áp dụng Rate Limiter nào, dễ dàng kiểm soát các rules hơn.
Ví dụ:
- Bạn có nhiều API Endpoint, hãy tạo 1 Rate Limiter là: api
- Bạn có nhiều Ajax actions, hãy tạo 1 Rate Limiter là: ajax
3. Sử dụng:
Class RateLimiter nằm trong thư mục: /app/Extend/Instances/Cache/RateLimiter.php
Bạn sẽ đặt RateLimiter::get() phía trước code thực thi, nhằm ngăn chặn code thực thi khi đạt giới hạn request, như sau:
class ApiController extends BaseController {
public function get_all_users(\WP_REST_Request $request): array {
// Rate limit for 10 requests per 30 seconds based on the user display name or request IP address.
$rateLimitKey = 'api_get_all_users_'. $this->request->getClientIp();
$rateLimitByIp = RateLimiter::get('api', $rateLimitKey)->consume()->isAccepted();
// Rate limit exceeded handle.
if (false === $rateLimitByIp) {
return Funcs::response(false, null, 'Rate limit exceeded. Please try again later.', 429);
}
// Get all users.
$users = get_users();
// Response.
return Funcs::response(true, $users, 'Get all users successfully!', 200);
}
}
Và đây là cấu hình của Rate Limiter: api
'api' => [
'id' => 'api',
'policy' => 'fixed_window',
'limit' => 10,
'interval' => '30 seconds',
]
Chúc bạn thành công!