مكتبة PSR-compliant Rate Limiter تدعم Redis و MongoDB و MySQL
مع موجه (Resolver) ديناميكي، وتكامل مباشر مع الـ Middleware، وتوافق مع العقود (Enums) القابلة لإعادة الاستخدام.
- المرحلة 1 – إعداد البيئة (محليًا)
- المرحلة 2 – الهيكل الأساسي
- المرحلة 3 – مشغلات التخزين (Drivers)
- المرحلة 3.1 – إعادة هيكلة Enums & Contracts
- المرحلة 4 – الموجه & Middleware
- المرحلة 4.1 – تكامل مستمر CI (Docker + GitHub Actions)
- المرحلة 5 – التأخير التصاعدي (Exponential Backoff) والحد العام (Global Limit)
composer install
cp .env.example .envثم عدّل ملف .env ليطابق إعدادات قاعدة البيانات والمشغّل (Driver) المحلي لديك.
توفر مكتبة Maatify Rate Limiter واجهة موحدة للتحكم في معدلات الطلب (Rate Limiting) عبر بيئات تخزين متعددة (مثل Redis و MongoDB و MySQL) مع دعم موجه ديناميكي (Dynamic Resolver).
تتوافق مع معايير PSR-12 و PSR-15 و PSR-7 ويمكن دمجها مباشرة مع أطر مثل Slim أو Laravel.
maatify-rate-limiter/
│
├── .env.example
├── composer.json
├── .github/
│ └── workflows/
│ └── ci.yml
├── docker-compose.ci.yml
├── src/
│ ├── Config/
│ ├── Contracts/
│ ├── DTO/
│ ├── Drivers/
│ ├── Enums/
│ ├── Exceptions/
│ ├── Middleware/
│ └── Resolver/
│
├── tests/
├── docs/
│ └── phases/
│ ├── README.phase1.md
│ ├── README.phase2.md
│ ├── README.phase3.md
│ ├── README.phase3.1.md
│ ├── README.phase4.md
│ └── README.phase4.1.md
│
├── CHANGELOG.md
├── VERSION
└── README.md
🚀 تم تنفيذ التكامل الكامل باستخدام Docker Compose + GitHub Actions
- تشغيل Redis و MySQL و MongoDB داخل بيئات مستقلة.
- تنفيذ PHPUnit داخل Docker مع عرض مباشر للنتائج.
- توليد تلقائي لملف
.envداخل خط الأنابيب. - تخزين مؤقت لحزم Composer لتسريع التشغيل.
- إمكانية رفع نتائج الاختبارات تلقائيًا (
tests/_output).
1.0.0-alpha-phase5
-
إضافة محدّد معدل تفاعلي يعتمد على التأخير التصاعدي (2ⁿ).
-
إضافة حد عام لكل IP عبر كل أنواع العمليات.
-
توسيع
RateLimitStatusDTOلتتضمنbackoffSecondsوnextAllowedAt. -
إضافة اختبارات جديدة
tests/BackoffTest.php. -
تحديث ملف
.env.exampleبالقيم التالية:GLOBAL_RATE_LIMITGLOBAL_RATE_WINDOWBACKOFF_BASEBACKOFF_MAX
| البيئة | مدعومة | الملاحظات |
|---|---|---|
| PHP (محلي) | ✅ | يعمل مباشرة |
| Slim | ✅ | متوافق مع PSR-15 |
| Laravel | ✅ | Middleware جاهز |
| Redis / Mongo / MySQL | ✅ | يمكن التبديل بينها بسهولة |
| معايير PSR | ✅ | PSR-7 / PSR-15 / PSR-12 |
$resolver = new RateLimiterResolver(['driver' => 'redis']);
$status = $resolver->resolve()->attempt('192.168.1.1', RateLimitActionEnum::LOGIN, PlatformEnum::WEB);إضافة Middleware للتحكم في معدل الطلب:
$app->add(new RateLimitHeadersMiddleware(
$limiter,
RateLimitActionEnum::LOGIN,
PlatformEnum::WEB
));try {
$status = $limiter->attempt($key, RateLimitActionEnum::API_CALL, PlatformEnum::API);
echo json_encode(['remaining' => $status->remaining]);
} catch (TooManyRequestsException $e) {
http_response_code(429);
echo json_encode(['retry_after' => $status->retryAfter ?? 60]);
}try {
$status = $limiter->attempt('192.168.1.5', RateLimitActionEnum::LOGIN, PlatformEnum::WEB);
} catch (TooManyRequestsException $e) {
echo "⛔ انتظر {$status->backoffSeconds} ثانية قبل المحاولة التالية";
}تتحكم هذه المتغيرات في سلوك الحد العام والتأخير التصاعدي
وتُستخدم على مستوى النظام أو داخل ملفات .env.
| المتغير | الشرح | المثال | النوع |
|---|---|---|---|
GLOBAL_RATE_LIMIT |
الحد الأقصى للطلبات المسموح بها من نفس الـ IP خلال فترة زمنية محددة. | 5 |
عدد صحيح |
GLOBAL_RATE_WINDOW |
مدة نافذة القياس بالثواني (بعدها يتم تصفير العدّاد). | 60 (دقيقة واحدة) |
عدد صحيح |
BACKOFF_BASE |
الأساس الرياضي للتأخير التصاعدي. | 2 → 2، 4، 8، 16... |
رقم (float أو int) |
BACKOFF_MAX |
الحد الأقصى لمدة الانتظار بالثواني. | 3600 (ساعة واحدة) |
عدد صحيح |
📘 المعادلة الرياضية:
backoff_seconds = min( BACKOFF_BASE ** violation_count , BACKOFF_MAX )
GLOBAL_RATE_LIMIT=5
GLOBAL_RATE_WINDOW=60
BACKOFF_BASE=2
BACKOFF_MAX=3600- استخدم قيمًا منخفضة مثل
5طلبات في الدقيقة لتسجيل الدخول أو OTP. - استخدم قيمًا أعلى للـ APIs العامة.
BACKOFF_BASE=2يعطي سلوكًا تصاعديًا متوازنًا.- تأكد من إرسال ترويسة
Retry-Afterعند الرد برمز الحالة 429.
| عدد مرات التجاوز | مدة الانتظار (ثانية) |
|---|---|
| 1 | 2 |
| 2 | 4 |
| 3 | 8 |
| 4 | 16 |
| 5 | 32 |
| ... | حتى الوصول إلى BACKOFF_MAX |
لتشغيل المكتبة بشكل كامل:
composer require psr/http-message psr/http-server-middleware psr/http-server-handlerلدمجها مع Slim Framework:
composer require slim/slimمسموح بالاستخدام والتعديل والتوزيع مع ذكر المصدر.
المطور: Maatify.dev
المسؤول: محمد عبدالعليم
المشروع: maatify:rate-limiter
✨ تمت ترجمة هذا الملف رسميًا لتوفير توثيق عربي متكامل. 🔗 النسخة الأصلية بالإنجليزية