التواصل مع الدعم

نردّ عبر البريد الإلكتروني، عادةً خلال يومين.

يفحص Google reCAPTCHA هذا الإرسال للحماية من إساءة الاستخدام؛ وتُرسَل بيانات إلى Google. لا يُحمَّل السكربت إلا عند فتح هذا النموذج.

→ كل المقالات

تخزين صور العدادات مؤقتًا في الذاكرة

ما يقارب خُمس صور العدادات التي ترسمها هذه الخدمة لم يعد يغيّر شيئًا. فسكربت لتتبع حركة الفأرة من الجيل السابق يعيد تحميل الصورة مع كل حركة، ومنذ أن توقفت تلك الطلبات عن زيادة أي قيمة، صار كل طلبين متتاليين منها ينتجان الصورة نفسها، بايتًا ببايت.

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

ليس على القرص

يعمل هذا على خادم صغير، والقرص بطاقة SD. وتخزين الصور المرسومة عليها مؤقتًا كان سيعني نحو 70 MB من الكتابة يوميًا، مقابل توفير مقيس قدره 1.6 دقيقة من وقت المعالج يوميًا.

هذه مقايضة سيئة. فبطاقات SD تتلف من الكتابة، وما يُشترى هنا لا يتجاوز خطأ تقريب على جهاز لا يعاني اختناقًا في المعالج. لذلك توجد الذاكرة المؤقتة في /dev/shm، وهو tmpfs، أي ذاكرة RAM. القياس هناك: 0.027 ms للقراءة، و 0.036 ms للكتابة، و 1.9 GB مساحة حرة.

ما كان سيكلّفه، يوميًا70 MBما كان سيوفّره، يوميًا1.6 دقيقةوحدات مختلفة عن قصد — هذه هي المقايضة

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

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

المفتاح يحتوي على الأرقام

مفتاح التخزين المؤقت المعتاد هو هوية مع مدة صلاحية، ومدة الصلاحية رهان: لم يتغير شيء مهم في الدقائق الخمس الأخيرة. أما في العداد، فالشيء الذي يتغير هو بالضبط الشيء المعروض.

لذلك تدخل القيم المعروضة في المفتاح نفسه. إذا تغيّر رقم، صار المفتاح مختلفًا، وتُرسم الصورة من جديد. فالرهان يختفي بدلًا من أن يُعقد بحذر. كل زيارة معدودة تزيد على الأقل المجموع الكلي منذ البداية، لذا لا يمكن أن تُقدَّم لأي زيارة معدودة صورة قديمة. ومدة الصلاحية المتبقية ليست إلا حدًا أعلى للقيم التي ليست في المفتاح — الأرقام الأسبوعية والشهرية والسنوية.

ما كان يجب التحقق منه أولًا

لا تكون الذاكرة المؤقتة آمنة إلا إذا كان ما تخزّنه دالةً في مفتاحها. وهذا ادعاء يخص كل تصميم، وقد جرى التحقق منه بدلًا من افتراضه:

  • لا يستخدم أي تصميم rand()، mt_rand()، shuffle() أو uniqid()
  • لا يقرأ أي تصميم الساعة بدقة أعلى من الساعات
  • معاملات التتبع من السكربت القديم لا تُقرأ في أي مكان من شجرة الكود

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

وإذا فشل أي شيء هنا — مجلد تتعذر قراءته، أو قرص ممتلئ، أو مدخل تالف — تُرسم الصورة ببساطة بالطريقة العادية. ولا يجوز أبدًا أن تكون الذاكرة المؤقتة سببًا في عدم ظهور عداد.

إعلان