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 مع التحقق التلقائي لإبطال التخزين المؤقت لتقليل رحلات Redis والزمن المستغرق بشكل كبير. تم بناؤه خصيصًا لبيئات Laravel Octane، ويستخدم APCu أو Swoole Table كطبقة تخزين مؤقت محلية تبقى متزامنة مع Redis من خلال رسائل الإبطال.

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

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

مثال

// قم بتكوين recall كسائق التخزين المؤقت الخاص بك
// config/cache.php
'stores' => [
'recall' => [
'driver' => 'recall',
],
],
 
// استخدمه كأي تخزين مؤقت في Laravel
use Illuminate\Support\Facades\Cache;
 
// المكالمة الأولى: يستخرج من Redis، ويخزن محليًا
$user = Cache::store('recall')->get('user:1');
 
// المكالمات اللاحقة: تقدم من APCu/Swoole Table المحلي (ميكروثوان)
$user = Cache::store('recall')->get('user:1');
 
// عندما يتم تحديث user:1 في أي مكان، يقوم Redis بإخطار 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 (لمشغل 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. هذا يلغي زمن الاتصال أثناء الطلب الأول.

معالجة التكتلات

عند التمكين، يقوم Recall بمعالجة رسائل الإبطال في أحداث تكتلات 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:

; الافتراضي هو 32MB، زيادة لتلبية احتياجات التخزين المؤقت الأكبر
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

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

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

ஆதரவு வழிகாட்டிகள்

எங்கள் திறந்த மூல தொகுப்பை தேர்ந்தெடுப்பதற்கு நன்றி! தயவுசெய்து இந்த ஆதரவு வழிகாட்டிகளை ஒரு நிமிடம் பார்ப்பதற்கு அனுக்கூலமாக இருக்கவும். இவை எங்கள் திட்டத்தில் அதிகतम முறையில் உதவுவன.

சமூகம் சிரம இடைமுகம்

எமது திறந்த மூல திட்டம் எமது அற்புதமான சமூகத்தால் ஆதரிக்கப்படுகின்றது. நீங்கள் கேள்விகள் அல்லது உதவிக்கு தேவைப்பட்டால், StackOverflow மற்றும் மற்ற ஆன்லைன் ஆதவாரங்கள் உங்கள் சிறந்த வாய்ப்புகள்.

பிழைகள் மற்றும் அம்ச முன்னுரிமை

ஒரு திறந்த மூல திட்டத்தை நிர்வகிக்கும் உண்மை, ஒவ்வொரு புகாரளிக்கப்பட்ட பிழையும் அல்லது அம்ச கோரிக்கையையும் உடனே தீர்க்க முடியாது. நாம் கேள்விகளை அடுத்தடுத்து தெரிவிக்கும் முறையில் முன்னுரிமை அளிக்கிறோம்:

1. எமது கட்டணம் முறைபடுத்திய தயாரிப்புகளை பாதிக்கும் பிழைகள்

எமது கட்டணம் மூலம் விற்பனை செய்யப்பட்ட தயாரிப்புகளை பாதிக்கும் பிழைகள் எப்போதும் எங்கள் மேற்பார்வை ஆகும். சில சந்தர்பங்களில், நாங்கள் நேரிடையாக எங்களுக்கு பாதிக்கும் பிழைகளை மட்டும் பரிசீலிக்கலாம்.

2. சமூகப் பூல் கோரிக்கைகள்

நீங்கள் ஒரு பிழையை அடையாளம் கண்டு அதை தீர்க்க ஒரு தீர்வு உருவாக்கினால், தயவுசெய்து ஒரு பூல் கோரிக்கையை சமர்ப்பிக்கவும். எமது தயாரிப்புகளை பாதிக்கும் கேள்விகளுக்கு பிறகு, நாங்கள் இந்த சமூக-வழி தீர்வுகளை அடுத்த மேலான முன்னுரிமை அளிக்கிறோம். மதிப்பீடு செய்யப்பட்டு ஒப்புதல் பெற்றவுடன், உங்கள் தீர்வை ஒருங்கிணைப்போம் மற்றும் உங்கள் பங்களிப்புக்கு credits அளிக்கிறோம்.

3. நிதி ஆதரவு

மேற்கொள்ளாத பிரச்சினைகள் வரையறுக்கப்பட்ட வகைகளுக்கு கவனமாக, நீங்கள் அதன் தீர்வுக்கு நிதி உதவியை தேர்வு செய்யலாம். ஒவ்வொரு திறந்த கேள்விக்கும் நீங்கள் நிதி உதவி செய்யலாம். நாங்கள் வழங்கப்பட்ட நிதி அளவூடங்கை அடிப்படையாகக் கொண்டு இந்த பிரச்சினைகளை முன்னுரிமையளிக்கிறோம்.

சமுதாய பங்களிப்புகள்

திறந்த மூல செயல்திறனான பேனையில் அதன் சமுதாயம் செயலில் இருக்க wanneerானபோது வளமாகிறது. நீங்கள் பிழைகளை சரிசெய்யவில்லை எனினும், குறியீட்டு மேம்பாடுகள், ஆவணங்களில் புதுப்பிப்புகள், பயிற்சிகள் அல்லது சமுதாயச் चैनல்களில் மற்றவர்களை ஆதரவளிக்க உதவுவதன் மூலம் பங்களிப்பை சார்ந்துகொள்ள உங்கள் எண்ணங்களை மதியுங்கள். ஐந்தில் நாங்கள் அனைவரையும், சமூகமாக, திறந்த மூல வேலைக்கு அனைத்து அளவிதான் ஆதரிக்கச் சேற்படுத்துகிறோம்.

மீளவேண்டும் என்றால், DefectiveCode எமது கட்டணம் முறையூடான தயாரிப்புகளை பாதிக்கும் பிழைகள், சமூகப் பூல் கோரிக்கைகள் மற்றும் அந்த பிரச்சினைகளுக்கு பெறப்பட்ட நிதி ஆதரவுக்கே முன்பீற்ற அளிக்கும்.

உரிமம் - MIT உரிமம்

காப்புரிமை © Defective Code, LLC. அனைத்து உரிமைகளும் பாதுகாக்கப்பட்டவை

இந்த மென்பொருளுக்கும் அதற்கு உடைய ஆவணக் கோப்புகளுக்கும் (இது "மென்பொருள்") ஒரு நகலைப் பெறும் எந்த நபர்க்கும், கட்டுக்கோப்புகள் இல்லாமல், மென்பொருளில் முகாமை செய்ய அனுமதிக்கப்படுகிறது, இதில் செயல்பாட்டின் உரிமைகள், நகலெடுக்கவும், மாற்றவும், இணைக்கவும், வெளியிடவும், பகிர்வு உரிமம் வழங்கவும் மற்றும்/அல்லது மென்பொருளின் நகல்களை விற்கவும், மற்றும் மென்பொருளின் நகல்களைப் பெறும் நபர்களுக்கு இதைப் செய்ய அனுமதிக்கவும், கீழ்க்காணும் நிலைகளை பின்பற்றுவதற்குப் பண்படுத்தப்படுகிறது:

மேலே குறிப்பிடப்பட்ட காப்புரிமை அறிவிப்பு மற்றும் இந்த அனுமதி அறிவிப்பு அனைத்துப் பிரதிகள் அல்லது முக்கியப் பகுதிகளிலும் உள்ளடக்கப்பட வேண்டும்.

மென்பொருள் "தொலைவிலிருந்து" வழங்கப்படுகிறது, எந்தப் பாலம்ஸ், நடைமுறைகளிலும் ஏதாவது வாக்குறுதி அல்லது குறிப்பிடப்பட்டுள்ளது, ஆனால் வரம்பற்ற வகையில் விற்பனைதிறன், குறிப்பிட்ட ஒரு நோக்கத்திற்கான வசதி மற்றும் உரிமை மீறல் ஆகியவற்றுக்கான வாக்குறுதிகள். எந்த சந்தர்ப்பத்திலும் ஆசிரியர்கள் அல்லது காப்புரிமையாளர்கள் எந்த உரிமையைக் கொண்டாட முடியாது, எந்தக் குற்றத்தை, சேதப்படுத்தல்களை அல்லது பிற பொறுப்புகளை அட/thread-modal/ம், ஒப்பந்தத்தின் ஒரு நடவடிக்கையின்படி, ஆபத்து அல்லது வேறென்னவாக இருந்தாலும், மென்பொருள் அல்லது மென்பொருளைப் பயன்படுத்துவதில் இருந்ததாகவும் உள்ள தேவை/request-modal/ியைக் கொண்டாட முடியாது.