Laravel / المتقدم / الدرس 14
صحة التخزين المؤقت والتزامن
عامل المخزن المؤقت كبيانات مشتقة محددة الإصدار والنطاق واختر حداثتها وإبطالها وأقفالها وفق عقد العمل.
في هذه الصفحة
أهداف الدرس
- بناء المفاتيح من نطاق المستأجر وكل مدخل يغيّر النتيجة.
- تمييز جلب المخزن عند الغياب من حماية التزاحم.
- شرح مدد الأقفال والبيانات القديمة وافتراضات المشغل.
المخزن المؤقت نسخة لها سياسة اتساق
يقلل التخزين تكرار العمل وتبقى البيانات الأصلية والصلاحيات خارجه. حدّد النتيجة والجمهور والقدم المقبول والتغيير المبطل. تستخدم التجربة عد منشورات منشورة لمستأجر يراه أعضاؤه المسموحون، لا مخزن صلاحيات. قد تختلف سياسة الرصيد والإلغاء والتخصيص. اختر بديل الانقطاع دون تجاوز أمان أو إغراق قاعدة بإعادة حساب غير محدودة.
تعبّر المفاتيح عن هوية النتيجة المشتقة
ضمّن المستأجر وإصدار النتيجة والمرشحات المطَبّعة، وقد تلزم الصفحة واللغة والرؤية أو الإذن الشخصي. يرتب نموذج PHP خريطة مسطحة صغيرة قبل البصمة ويثبت تطابق ترتيبين واختلاف مستأجر. لا يفحص الصلاحية أو بيانات متداخلة عامة ولا يتصل بمخزن. تسهّل البادئة تغيير التمثيل وتحتاج النسخ القديمة انتهاءً أو تنظيفًا مقصودًا.
<?php
declare(strict_types=1);
function reportKey(int $tenantId, array $filters): string
{
if ($tenantId < 1) { throw new InvalidArgumentException("invalid tenant"); }
ksort($filters);
return "report:v1:tenant:".$tenantId.":".hash("sha256", json_encode($filters, JSON_THROW_ON_ERROR));
}
$first = reportKey(7, ["status" => "published", "locale" => "en"]);
$same = reportKey(7, ["locale" => "en", "status" => "published"]);
$other = reportKey(8, ["status" => "published", "locale" => "en"]);
echo json_encode([$first === $same, $first === $other], JSON_THROW_ON_ERROR), PHP_EOL;
[true,false]
يثبت الناتج مساواة ترتيبَي الخريطة المسطحة وفصل المستأجر، ولا يختبر دوام مخزن Laravel أو أقفاله.
قد يحفز الغياب حسابات متزامنة كثيرة
تتجنب remember الحساب عند الوجود ولا تضمن حسابًا موزعًا واحدًا؛ فقد تبدأ غيابات متزامنة. يضع المقطع قفلًا حول فحص ثانٍ ليستفيد التالي من النتيجة المحدثة. يفترض Post بحقلَي tenant_id وstatus وإذنًا مثبتًا للمستأجر 7. يلزم مشغل أقفال مشترك؛ فلا تنسق مصفوفة عملية مستقلة الخوادم. المدد فرض توضيحي لا توصية ضبط.
<?php
use App\Models\Post;
use Illuminate\Support\Facades\Cache;
$key = "posts:published-count:v1:tenant:7";
$count = Cache::lock($key.":refresh", 10)->block(2, function () use ($key): int {
return Cache::remember($key, 30, function (): int {
return Post::query()->where("tenant_id", 7)->where("status", "published")->count();
});
});
المتوقع بتجربة مخزن مشترك معزول: يحسب حامل القفل الغياب ويستفيد التالي من القيمة. قد تنتهي مهلة الانتظار ولا يتصل الدرس بمخزن أو قاعدة.
تحديد معنى القديم قبل تقديمه
قد تنتهي مدة القفل قبل الحساب؛ فحد العمل أو صمّم التجديد والتمييز وفق المشغل. عالج مهلة الانتظار بحد يختار استجابة مقبولة. تدعم flexible تقديم القديم أثناء تحديثه بنوافذ زمنية، فقط إذا جاز القديم لا لإذن ملغى. التثبيت والإبطال منفصلان ولهما سباق وفشل وإعادة تعبئة قديمة. اقرأ المرجع الأصلي بمعاملته للقرارات المتسقة بشدة.
اختبار الفصل والغياب والإبطال صراحة
استخدم مستأجرين بمرشحات متطابقة ونتائج مختلفة واختبر عدم تسربها. غط الغياب والوجود والانتهاء والتحديث المتزامن والمهلة والإبطال. يثبت mock استدعاء remember لا ذرية المخزن أو مشاركة الخوادم. راقب النسب والمدد والتزاحم بتسميات محدودة. لا تصلح بمسح واسع روتيني قد يحذف حالة أخرى ويسبب عاصفة غياب. افصل التشغيل الإداري عن أمثلة القراءة.
الأخطاء الشائعة وإصلاحها
تقرير مؤقت يظهر لمستأجر آخر.
- لماذا يحدث؟
- أغفل المفتاح نطاقًا أمنيًا يغيّر النتيجة.
- كيف تصلحه؟
- ضمّن النطاق المفحوص وراجع الإبطال.
- كيف تتجنب تكراره؟
- اختبر مستأجرين بمرشحات متطابقة.
عمال كثيرون يحسبون النتيجة المنتهية نفسها.
- لماذا يحدث؟
- اعتُبر جلب الغياب تحديثًا حصريًا.
- كيف تصلحه؟
- استخدم قفلًا مشتركًا أو سياسة قدم مناسبة.
- كيف تتجنب تكراره؟
- قِس التزاحم واختبر الغياب المتزامن.
تداخل تحديث قديم بعد انتهاء قفله.
- لماذا يحدث؟
- كانت مدة القفل أقصر من العمل.
- كيف تصلحه؟
- حد العمل وطبّق حماية ملكية تناسب المشغل.
- كيف تتجنب تكراره؟
- عامل عمر القفل كافتراض صحة.
اختبر فهمك
1. يضيف التقرير عنوانًا حسب اللغة ويبقى المفتاح للمستأجر والحالة. اشرح العيب واختبار إصلاحه.
اعرض الحل المشروح
قد تتشارك اللغتان نتيجة بعنوان خاطئ. أضف اللغة المفحوصة وافحص اختلاف en وar مع ثبات ترتيب المرشحات. يختبر ذلك الهوية، وتبقى تجربة مخزن معزولة للتمثيل والإبطال.
2. يستغرق التحديث خمس عشرة ثانية وقفلُه عشر. لماذا لا يكفي اكتسابه أولًا وما القرار اللازم؟
اعرض الحل المشروح
قد يكتسب آخر القفل قبل نهاية الأول. حد العملية أو برر مدة أطول أو التجديد أو حماية أقوى للمشغل، واحفظ التحديث الآمن وعالج الانتظار منفصلًا. لا تمدد مدة الانتظار ملكية القفل ولا توقف حامله المنتهي.
أهم ما تعلمته
- تضم هوية المخزن كل نطاق يغيّر النتيجة.
- الحداثة والحصرية سياستان منفصلتان.
- لا تثبت المحاكاة والمخازن المحلية صحة موزعة.