Defective Code Logo

Total Downloads Latest Stable Version Latest Stable Version

English | العربية | বাংলা | Bosanski | Deutsch | Español | Français | हिन्दी | Italiano | 日本語 | 한국어 | मराठी | Português | Русский | Kiswahili | தமிழ் | తెలుగు | Türkçe | اردو | Tiếng Việt | 中文

مقدمة

Recall هي حزمة تخزين مؤقتة عالية الأداء تعتمد على العميل لـ Redis و Laravel. تستفيد من ميزة التخزين المؤقت على جانب العميل في Redis 6 مع الإبطال التلقائي لتقليل الرحلات الزمنية ووقت الانتظار بشكل ملحوظ. تم بناؤها خصيصًا لبيئات Laravel Octane، حيث تستخدم APCu أو Swoole Table كطبقة تخزين مؤقت محلي تبقى متزامنة مع Redis من خلال رسائل الإبطال.

عند استرداد قيمة من Redis، تخزن Recall هذه القيمة محليًا. عندما تتغير تلك القيمة في Redis (من أي عميل)، يقوم Redis notifying Recall تلقائيًا بإبطال النسخة المحلية. وهذا يمنحك سرعة التخزين المؤقت في الذاكرة مع ضمانات التناسق التي يقدمها Redis.

الميزات الرئيسية

مثال

// قم بتكوين Recall كسائق التخزين المؤقت الخاص بك
// config/cache.php
'stores' => [
'recall' => [
'driver' => 'recall',
],
],
 
// استخدمه مثل أي تخزين مؤقت في Laravel
use Illuminate\Support\Facades\Cache;
 
// الاتصال الأول: ي fetch من Redis، ويخزن محليًا
$user = Cache::store('recall')->get('user:1');
 
// الاتصالات التالية: تُقدم من APCu/Swoole Table المحلية (ميكروثانية)
$user = Cache::store('recall')->get('user:1');
 
// عندما يتم تحديث user:1 في أي مكان، يقوم Redis notifying Recall بإبطال
Cache::store('recall')->put('user:1', $newUserData, 3600);
// يتم إبطال التخزين المؤقت المحلي تلقائيًا على جميع العمال

التثبيت

قم بتثبيت الحزمة عبر Composer:

composer require defectivecode/laravel-recall

المتطلبات

الاستخدام

الإعداد الأساسي

  1. أضف تخزين Recall المؤقت إلى config/cache.php:
'stores' => [
// ... متاجر أخرى
 
'recall' => [
'driver' => 'recall',
],
],
  1. استخدم تخزين التخزين المؤقت في تطبيقك:
use Illuminate\Support\Facades\Cache;
 
// تخزين قيمة (تكتب إلى Redis)
Cache::store('recall')->put('key', 'value', 3600);
 
// استرجاع قيمة (الاتصال الأول يضرب Redis، والاتصالات اللاحقة تستخدم التخزين المؤقت المحلي)
$value = Cache::store('recall')->get('key');
 
// حذف قيمة
Cache::store('recall')->forget('key');

كيف يعمل

  1. القراءة الأولى: يتم جلب القيمة من Redis وتخزينها في التخزين المؤقت المحلي APCu/Swoole Table
  2. القراءات اللاحقة: يتم تقديم القيمة مباشرة من الذاكرة المحلية (دون الملي ثانية)
  3. الكتابة من أي مكان: عندما يقوم أي عميل بتعديل المفتاح في Redis، يرسل Redis رسالة إبطال
  4. الإبطال التلقائي: تتلقى Recall الرسالة وتزيل المفتاح من التخزين المؤقت المحلي
  5. القراءة التالية: يتم جلب قيمة جديدة من Redis وتخزينها محليًا مرة أخرى

هذا النمط قوي بشكل خاص في بيئات Laravel Octane حيث تبقى العمال بين الطلبات، مما يسمح للتخزين المؤقت المحلي بالتجمع وخدمة العديد من الطلبات من الذاكرة.

التكامل مع Octane

تتكامل Recall تلقائيًا مع Laravel Octane عند توفره:

لا يتطلب أي تكوين إضافي. التكامل تلقائي عند تثبيت Octane.

التكوين

انشر ملف التكوين:

php artisan vendor:publish --tag=recall-config

هذا ينشئ config/recall.php مع الخيارات التالية:

التمكين/الإيقاف

'enabled' => env('RECALL_ENABLED', true),

عند تعطيله، يتم تمرير Recall مباشرة إلى Redis دون استخدام طبقة التخزين المؤقت المحلية. مفيد لأغراض التصحيح أو النشر التدريجي.

تخزين Redis

'redis_store' => env('RECALL_REDIS_STORE', 'redis'),

تخزين التخزين المؤقت في Laravel الذي سيتم استخدامه لعمليات Redis. يجب أن تشير إلى تخزين Redis تم تكوينه في config/cache.php.

بادئات التخزين المؤقت

'cache_prefixes' => [],

تخزين المفاتيح فقط التي تتطابق مع هذه البادئات محليًا. اتركها فارغة لتخزين جميع المفاتيح.

// تخزين مفاتيح المستخدم والإعدادات محليًا فقط
'cache_prefixes' => ['users:', 'settings:', 'config:'],

هذا مفيد عندما تكون لديك مفاتيح عالية الحجم تتغير بشكل متكرر وليست بحاجة إلى التخزين محليًا.

إعداد التخزين المؤقت المحلي

'local_cache' => [
// السائق: "apcu" أو "swoole"
'driver' => env('RECALL_LOCAL_DRIVER', 'apcu'),
 
// بادئة لمفاتيح التخزين المؤقت المحلي
'key_prefix' => env('RECALL_LOCAL_PREFIX', 'recall:'),
 
// فترة صلاحية افتراضية بالثواني (شبكة الأمان إذا تم تفويت الإبطال)
'default_ttl' => (int) env('RECALL_LOCAL_TTL', 3600),
 
// حجم جدول Swoole (قوة 2، فقط لسائق swoole)
'table_size' => (int) env('RECALL_SWOOLE_TABLE_SIZE', 65536),
 
// الحد الأقصى من البايتات لكل قيمة في Swoole Table (فقط لسائق swoole)
'value_size' => (int) env('RECALL_SWOOLE_VALUE_SIZE', 8192),
],

سائق APCu (افتراضي)

يعمل سائق APCu مع جميع بيئات PHP وخوادم Octane (Swoole، RoadRunner، FrankenPHP). يخزن القيم المخزنة في الذاكرة المشتركة المتاحة لجميع عمليات PHP.

المتطلبات:

سائق Swoole Table

يستخدم سائق Swoole Table جداول الذاكرة المشتركة لـ Swoole، مما يوفر الوصول المتسق عبر الأوتار داخل نفس العامل. الأفضل لبيئات Swoole/OpenSwoole.

نصائح التكوين:

مستمعو Octane

'listeners' => [
// تسخين الاتصال عند بدء العامل (يقلل من زمن انتظار الطلب الأول)
'warm' => env('RECALL_LISTEN_WARM', true),
 
// معالجة الإلغاءات في أحداث tick (أكثر استجابة، عبء إضافي بسيط)
'tick' => env('RECALL_LISTEN_TICK', false),
],

تسخين الاتصالات

عند التمكين، تؤسس Recall اشتراك إبطال Redis عند بدء عامل Octane. هذا يقضي على زمن الاتصال في الطلب الأول.

معالجة Tick

عند التمكين، تعالج Recall رسائل الإبطال في أحداث tick الخاصة بـ Octane بالإضافة إلى أحداث الطلب. يوفر ذلك إبطال تخزين مؤقت أكثر استجابة على حساب بعض العبء الإضافي.

الاستخدام المتقدم

معالجة الإبطال اليدوي

إذا كنت بحاجة إلى معالجة الإبطال يدويًا (مثلًا، في عملية طويلة الأمد):

use DefectiveCode\Recall\RecallManager;
 
$manager = app(RecallManager::class);
$manager->processInvalidations();

تفريغ التخزين المؤقت المحلي

لتفريغ التخزين المؤقت المحلي فقط دون التأثير على Redis:

use DefectiveCode\Recall\RecallManager;
 
$manager = app(RecallManager::class);
$manager->flushLocalCache();

إدارة الاتصال

use DefectiveCode\Recall\RecallManager;
 
$manager = app(RecallManager::class);
 
// تحقق مما إذا كان اتصال الاشتراك بالإبطال متصلًا
if ($manager->isConnected()) {
// ...
}
 
// فصل يدوي
$manager->disconnect();

التحسين

حدود طلبات العمال

تقوم Laravel Octane بدورة العمال بعد عدد معين من الطلبات القابلة للتكوين لمنع تسرب الذاكرة. عندما يتم دوران العامل، يتم حذف التخزين المؤقت المحلي. زيادة هذا الحد تسمح لتخزين Recall المحلي بالاستمرار لفترة أطول، مما يحسن معدلات ضرب التخزين المؤقت.

في config/octane.php:

// الافتراضي هو 500 طلب قبل الدوران
'max_requests' => 10000,

القيم الأعلى تعني استخدام أفضل للتخزين المؤقت ولكن تتطلب الثقة في أن تطبيقك لا يشكو من تسرب الذاكرة. راقب استخدام الذاكرة لدى العامل عند تعديل هذه القيمة.

التخزين المؤقت الانتقائي مع البادئات

استخدم cache_prefixes للتحكم في المفاتيح التي يتم تخزينها محليًا. هذا قيمته عندما:

// config/recall.php
'cache_prefixes' => [
'users:', // تخزين بيانات المستخدم محليًا
'settings:', // تخزين إعدادات التطبيق
'products:', // تخزين فهرس المنتج
],

المفاتيح التي لا تتطابق مع هذه البادئات ستعمل بشكل جيد ولكن ستتجاوز التخزين المؤقت المحلي، وتنتقل مباشرة إلى Redis.

اعتبارات الذاكرة

ذاكرة APCu

تشارك APCu الذاكرة عبر جميع عمليات PHP. قم بتكوين حد الذاكرة في php.ini:

; الافتراضي هو 32 ميجابايت، زيادة لحاجات التخزين المؤقت الأكبر
apc.shm_size = 128M

راقب استخدام APCu باستخدام apcu_cache_info():

$info = apcu_cache_info();
$memory = $info['mem_size']; // الاستخدام الحالي للذاكرة بالبايت

حجم جدول Swoole

تكون جداول Swoole ذات سعة ثابتة يتم تكوينها عند الإنشاء. التخطيط لحجم التخزين المؤقت المتوقع لديك:

'local_cache' => [
// الحد الأقصى من الإدخالات (يجب أن تكون قوة 2)
'table_size' => 65536, // 64K إدخال
 
// الحد الأقصى لحجم القيمة المسلسلة بالبايت
'value_size' => 8192, // 8KB لكل قيمة
],

استخدام الذاكرة: table_size × (value_size + overhead). تستخدم جدول بحد أقصى 65536 إدخالًا وقيم 8KB حوالي 512MB.

الأنماط الشائعة

إعداد تطبيق

// تخزين ميزات و إعدادات المؤقت
$features = Cache::store('recall')->remember('config:features', 3600, function () {
return Feature::all()->pluck('enabled', 'name')->toArray();
});
 
// عند تغيير الإعدادات، يتلقى جميع العمال التحديثات تلقائيًا

البيانات المرجعية المتاحة بشكل متكرر

// تخزين فئات المنتجات
$categories = Cache::store('recall')->remember('categories:all', 3600, function () {
return Category::with('children')->whereNull('parent_id')->get();
});
 
// تخزين أسعار صرف العملات
$rates = Cache::store('recall')->remember('rates:exchange', 300, function () {
return ExchangeRate::all()->pluck('rate', 'currency')->toArray();
});

بديل للعلامات التخزينية

لا تدعم Recall العلامات التخزينية، ولكن يمكنك تحقيق وظيفة مماثلة مع البادئات:

// بدلاً من العلامات، استخدم بادئات متسقة
Cache::store('recall')->put("blog:posts:{$id}", $post, 3600);
Cache::store('recall')->put("blog:comments:{$postId}", $comments, 3600);
 
// امسح جميع ذاكرة التخزين المؤقت المتعلقة بالمدونة حسب البادئة (يحتاج تنفيذ يدوي)
// أو اعتمد على الإبطال التلقائي عند تغيير البيانات

القيود

وضع خادم Redis Cluster

لا تدعم Recall وضع خادم Redis Cluster. يتطلب خيار REDIRECT في الأمر CLIENT TRACKING أن تكون كل من اتصال البيانات واتصال المشترك للإبطال على نفس عقدة Redis. في مجموعة، يتم توزيع المفاتيح عبر عدة عقد بناءً على فتحات الهاش، مما يجعل من المستحيل تلقي إلغاءات للمفاتيح المخزنة على عقد مختلفة.

لعمليات نشر Redis المجمعة، ضع في اعتبارك:

دعم الإرشادات

شكرًا لاختيارك حزمة المصادر المفتوحة الخاصة بنا! يرجى أخذ لحظة للاطلاع على هذه الإرشادات للدعم. ستساعدك في تحقيق أقصى استفادة من مشروعنا.

الدعم المدفوع من المجتمع

مشروعنا مفتوح المصدر مدفوع بمجموعتنا الرائعة. إذا كان لديك أي أسئلة أو تحتاج إلى مساعدة، فإن StackOverflow و موارد الإنترنت الأخرى هي أفضل خيارات لك.

الأخطاء، وأولويات الميزات

واقع إدارة مشروع مفتوح المصدر يعني أننا لا نستطيع معالجة كل خطأ تم الإبلاغ عنه أو طلب ميزة على الفور. نحن نعطي الأولوية للقضايا بالترتيب التالي:

1. الأخطاء التي تؤثر على منتجاتنا المدفوعة

تعتبر الأخطاء التي تؤثر على منتجاتنا المدفوعة دائمًا في قمة أولوياتنا. في بعض الحالات، قد نكتفي بمعالجة الأخطاء التي تؤثر علينا مباشرة.

2. طلبات السحب الخاصة بالمجتمع

إذا كنت قد حددت خطأ ولديك حل، يرجى تقديم طلب سحب. بعد القضايا التي تؤثر على منتجاتنا، نعطي الأولوية الأعلى لهذه الإصلاحات المدفوعة من المجتمع. بمجرد مراجعتها والموافقة عليها، سنقوم بدمج حلك ونذكر مساهمتك.

3. الدعم المالي

بالنسبة للقضايا خارج الفئات المذكورة، يمكنك اختيار تمويل حلها. كل قضية مفتوحة مرتبطة بنموذج طلب حيث يمكنك المساهمة ماليًا. نحن نعطي الأولوية لهذه القضايا بناءً على المبلغ المقدم من التمويل.

مساهمات المجتمع

تزدهر المصادر المفتوحة عندما يكون المجتمع نشطًا. حتى إذا لم تكن تقوم بإصلاح الأخطاء، قم بالتفكير في المساهمة من خلال تحسينات الكود، تحديثات الوثائق، الدروس التعليمية، أو من خلال مساعدة الآخرين في قنوات المجتمع. نحن نشجع الجميع، كمجتمع، على دعم العمل المفتوح المصدر.

للتأكيد، ستعطي DefectiveCode الأولوية للأخطاء بناءً على كيفية تأثيرها على منتجاتنا المدفوعة، وطلبات السحب الخاصة بالمجتمع، والدعم المالي المستلم للقضايا.

Lizenz - MIT Lizenz

Copyright © Defective Code, LLC. Alle Rechte vorbehalten

Hiermit wird kostenlos die Erlaubnis erteilt, an jede Person, die eine Kopie dieser Software und der zugehörigen Dokumentationsdateien (die "Software") erhält, mit der Software ohne Einschränkung umzugehen, einschließlich, aber nicht beschränkt auf die Rechte, die Software zu nutzen, zu kopieren, zu modifizieren, zu fusionieren, zu veröffentlichen, zu verteilen, Unterlizenzen zu erteilen und/oder Kopien der Software zu verkaufen, und Personen, denen die Software zur Verfügung gestellt wird, zu gestatten, dies zu tun, unter der Bedingung der folgenden Bedingungen:

Der obige Copyright-Hinweis und dieser Erlaubnishinweis müssen in allen Kopien oder wesentlichen Teilen der Software enthalten sein.

DIE SOFTWARE WIRD "WIE BESEHEN" BEREITGESTELLT, OHNE JEGLICHE GARANTIE, WELCHER ART, AUSDRÜCKLICH ODER IMPLIZIT, EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT AUF DIE GARANTIEN DER MARKTFÄHIGKEIT, EIGNUNG FÜR EINEN BESTIMMTEN ZWECK UND KEINEN RECHTSBRUCH. IN KEINEM FALL SIND DIE AUTOREN ODER COPYRIGHT-RECHTHABER FÜR IRGENDEINEN ANSPRUCH, SCHÄDEN ODER SONSTIGE HAFTUNG HAFTBAR, UNABHÄNGIG DAVON, OB IN EINER KLAGE AUS VERTRAG, DELIKT ODER SONSTIGEM, ENTSTEHEND AUS, IM HINBLICK AUF ODER IN VERBINDUNG MIT DER SOFTWARE ODER DER NUTZUNG ODER ANDEREN TRANSAKTIONEN IN DER SOFTWARE.