本文へ移動
cccskills
無料GitHub で公開

acc-create-rate-limiter

Generates Rate Limiter pattern for PHP 8.5. Creates request throttling with token bucket, sliding window, and fixed window algorithms. Includes unit tests.

インストール方法を見る

含まれるファイル(1)

  • SKILL.md4.9 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Rate Limiter Generator

Creates Rate Limiter pattern infrastructure for request throttling and API protection.

When to Use

ScenarioExample
API protectionPrevent abuse
Resource throttlingDatabase connection limits
Fair usagePer-user request limits
Burst protectionSpike handling

Component Characteristics

RateLimiterInterface

  • Common interface for all algorithms
  • Check and consume methods
  • Remaining capacity queries

Algorithms

  • Token Bucket: Smooth rate limiting with burst capacity
  • Sliding Window: Time-based with sliding window log
  • Fixed Window: Simple time-based counter

RateLimitResult

  • Contains allowed/denied status
  • Provides retry-after information
  • Generates HTTP headers

Generation Process

Step 1: Generate Core Components

Path: src/Infrastructure/Resilience/RateLimiter/

  1. RateLimiterInterface.php — Common interface
  2. RateLimitResult.php — Result value object with headers
  3. RateLimitExceededException.php — Exception with retry info
  4. StorageInterface.php — Storage abstraction

Step 2: Choose and Generate Algorithm

Choose based on use case:

  1. TokenBucketRateLimiter.php — For APIs with burst allowance
  2. SlidingWindowRateLimiter.php — For strict per-time limits
  3. FixedWindowRateLimiter.php — For simple rate limiting

Step 3: Generate Storage

  1. RedisStorage.php — Production storage with TTL

Step 4: Generate Tests

  1. {Algorithm}RateLimiterTest.php — Algorithm tests
  2. RateLimitResultTest.php — Result value object tests

File Placement

ComponentPath
All Classessrc/Infrastructure/Resilience/RateLimiter/
Unit Teststests/Unit/Infrastructure/Resilience/RateLimiter/

Naming Conventions

ComponentPatternExample
InterfaceRateLimiterInterfaceRateLimiterInterface
Token BucketTokenBucketRateLimiterTokenBucketRateLimiter
Sliding WindowSlidingWindowRateLimiterSlidingWindowRateLimiter
Fixed WindowFixedWindowRateLimiterFixedWindowRateLimiter
ResultRateLimitResultRateLimitResult
ExceptionRateLimitExceededExceptionRateLimitExceededException
Test{ClassName}TestTokenBucketRateLimiterTest

Quick Template Reference

RateLimiterInterface

interface RateLimiterInterface
{
    public function attempt(string $key, int $tokens = 1): RateLimitResult;
    public function getRemainingTokens(string $key): int;
    public function getRetryAfter(string $key): ?int;
    public function reset(string $key): void;
}

RateLimitResult

final readonly class RateLimitResult
{
    public static function allowed(int $remaining, int $limit, \DateTimeImmutable $resetsAt): self;
    public static function denied(int $limit, int $retryAfter, \DateTimeImmutable $resetsAt): self;
    public function isAllowed(): bool;
    public function isDenied(): bool;
    public function toHeaders(): array; // X-RateLimit-* headers
}

Usage Example

// Create limiter
$limiter = new TokenBucketRateLimiter(
    capacity: 100,
    refillRate: 10.0, // 10 tokens per second
    clock: $clock,
    storage: new RedisStorage($redis)
);

// Check limit
$result = $limiter->attempt('user:123');

if ($result->isDenied()) {
    throw new RateLimitExceededException(
        key: 'user:123',
        limit: $result->limit,
        retryAfterSeconds: $result->retryAfterSeconds
    );
}

// Add headers to response
foreach ($result->toHeaders() as $name => $value) {
    $response = $response->withHeader($name, (string) $value);
}

Algorithm Comparison

AlgorithmBurst HandlingMemoryPrecisionUse Case
Token BucketGood (configurable)LowMediumAPIs with burst allowance
Sliding WindowLimitedHighHighStrict per-time limits
Fixed WindowPoor (boundary issues)LowLowSimple rate limiting

Anti-patterns to Avoid

Anti-patternProblemSolution
No Redis/Shared StoragePer-instance limitsUse shared storage
Missing HeadersClient can't adaptReturn X-RateLimit-* headers
Single AlgorithmDoesn't fit all casesChoose per use case
No Retry-AfterClient spamsAlways return retry timing
Synchronous BlockingThread blockingUse non-blocking check

References

For complete PHP templates and examples, see:

  • references/templates.md — All algorithm implementations
  • references/examples.md — Middleware example and tests

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

Master backend architectures, REST API design, microservices, and server-side development across multiple languages. Use this as a central index to access specialized sub-skills.

日本語の概要は準備中です。原文の説明を表示しています。

MikeCheng1208/BattleTree22026年7月22日 更新

在每次回复中使用固定前缀并列出本次实际参考的指令/文件,便于校验是否遵循上下文与规则。

日本語の概要は準備中です。原文の説明を表示しています。

MikeCheng1208/BattleTree22026年7月22日 更新

Automate 21risk tasks via Rube MCP (Composio). Always search tools first for current schemas.

日本語の概要は準備中です。原文の説明を表示しています。

MikeCheng1208/BattleTree22026年7月22日 更新

Automate 2chat tasks via Rube MCP (Composio). Always search tools first for current schemas.

日本語の概要は準備中です。原文の説明を表示しています。

MikeCheng1208/BattleTree22026年7月22日 更新

Arquitecto de Soluciones Principal y Consultor Tecnológico de Andru.ia. Diagnostica y traza la hoja de ruta óptima para proyectos de IA en español.

日本語の概要は準備中です。原文の説明を表示しています。

MikeCheng1208/BattleTree22026年7月22日 更新

[00] META. Orchestrate skills into dynamic chains for complex tasks. Analyzes the task, discovers available skills, builds an optimal chain, explains why each skill is needed, and executes step-by-step with user confirmation. Use for any complex task requiring multiple thinking/research/analysis steps. Triggers on "plan this", "how to approach", "what's the strategy", "build a plan", or any multi-step problem requiring skill orchestration.

日本語の概要は準備中です。原文の説明を表示しています。

MikeCheng1208/BattleTree22026年7月22日 更新

MikeCheng1208 のスキルをすべて見る

このスキルの問題を報告する