التخزين المؤقت
تتضمن Queuety طبقة تخزين مؤقت تقلل استعلامات قاعدة البيانات في المسارات الأكثر استخدامًا، مثل فحوصات إيقاف قائمة الانتظار، وعدادات حدود المعدل، وعمليات البحث عن حالة سير العمل، وعمليات القفل. تُهيّأ ذاكرة التخزين المؤقت تلقائيًا عند استدعاء Queuety::init().
واجهة التخزين المؤقت
تُنفّذ جميع واجهات التخزين المؤقت الخلفية Queuety\Contracts\Cache:
| الطريقة | القيمة المعادة | الوصف |
|---|---|---|
get( string $key ) |
mixed |
استرجاع قيمة. تعيد null إذا لم يُعثر عليها أو انتهت صلاحيتها. |
set( string $key, mixed $value, int $ttl = 0 ) |
void |
تخزين قيمة. تعني قيمة TTL مقدارها 0 عدم انتهاء الصلاحية. |
delete( string $key ) |
void |
إزالة قيمة. |
has( string $key ) |
bool |
التحقق من وجود مفتاح وعدم انتهاء صلاحيته. |
add( string $key, mixed $value, int $ttl = 0 ) |
bool |
تعيين قيمة فقط إذا لم يكن المفتاح موجودًا بالفعل (بشكل ذري). تعيد true إذا عُيّنت القيمة. |
flush() |
void |
إزالة جميع العناصر من ذاكرة التخزين المؤقت. يستدعي ApcuCache::flush() الدالة apcu_clear_cache()، التي تمسح كل إدخالات APCu على الخادم، وليس إدخالات Queuety وحدها. |
الواجهات الخلفية المضمّنة
MemoryCache (الافتراضي)
Queuety\Cache\MemoryCache ذاكرة تخزين مؤقت مدعومة بمصفوفة ومخصصة لكل عملية. تُخزّن العناصر في مصفوفة PHP وتُفقد عند انتهاء العملية. وهي الواجهة الخلفية الافتراضية عند عدم توفر APCu.
لا تتطلب أي امتدادات، وتعمل جيدًا مع عمليات نشر ذات عامل واحد، كما تبقي كل عملية عامل معزولة عن غيرها.
ApcuCache
تستخدم Queuety\Cache\ApcuCache امتداد APCu لمشاركة الذاكرة بين جميع عمليات PHP على الخادم نفسه. وتُسبق جميع المفاتيح تلقائيًا بـqueuety: لتجنب التعارض مع التطبيقات الأخرى.
تتطلب هذه الواجهة الخلفية امتداد php-apcu، وتشارك إدخالات ذاكرة التخزين المؤقت بين العمال على الخادم نفسه، وتجعل add() ذريًا بالكامل عبر apcu_add().
الاكتشاف التلقائي
تختار Queuety\Cache\CacheFactory أفضل واجهة خلفية متاحة تلقائيًا:
إذا كان apcu_store() موجودًا وأعاد apcu_enabled() القيمة true، تستخدم Queuety ApcuCache. وإلا فستستخدم MemoryCache. يحدث ذلك داخل Queuety::init()، لذا لا يتطلب السلوك الافتراضي أي إعداد إضافي.
ما الذي يُخزّن مؤقتًا
تستخدم عدة أنظمة فرعية طبقة التخزين المؤقت داخليًا:
| البيانات | الغرض |
|---|---|
| حالة إيقاف قائمة الانتظار | تجنّب استعلام قاعدة البيانات في كل تكرار لحلقة العامل |
| عدادات حدود المعدل | تتبع أعداد التنفيذ في الذاكرة بدلًا من قاعدة البيانات |
| حالة سير العمل | تقليل عمليات القراءة أثناء تقدم سير العمل متعدد الخطوات |
| حالة القفل | تسريع فحوصات وجود الأقفال للمهام الفريدة والبرمجيات الوسيطة للتنافي |
إعداد TTL
مدة TTL الافتراضية للتخزين المؤقت هي 5 ثوانٍ. وتنطبق على حالة إيقاف قائمة الانتظار وعدادات حدود المعدل؛ أما قراءات حالة سير العمل وحالته فتُخزّن مؤقتًا لمدة ثابتة قدرها 2 ثانية لا يغيّرها الثابت. تجاوز القيمة الافتراضية باستخدام الثابت QUEUETY_CACHE_TTL في ملف wp-config.php:
define( 'QUEUETY_CACHE_TTL', 10 ); // 10 seconds
تعني مدة TTL الأقصر استعلامات أكثر تكرارًا لقاعدة البيانات وبيانات أحدث. أما المدة الأطول فتقلل الحمل على قاعدة البيانات لكنها تزيد تقادم البيانات. القيمة الافتراضية البالغة 5 ثوانٍ مناسبة لمعظم عمليات النشر.
واجهة تخزين مؤقت خلفية مخصصة
لاستخدام واجهة تخزين مؤقت خلفية مخصصة (مثل Redis أو Memcached أو أي خيار آخر)، نفّذ الواجهة Contracts\Cache واستدعِ Queuety::set_cache() قبل Queuety::init():
use Queuety\Contracts\Cache;
use Queuety\Queuety;
class RedisCache implements Cache {
public function get( string $key ): mixed { /* ... */ }
public function set( string $key, mixed $value, int $ttl = 0 ): void { /* ... */ }
public function delete( string $key ): void { /* ... */ }
public function has( string $key ): bool { /* ... */ }
public function add( string $key, mixed $value, int $ttl = 0 ): bool { /* ... */ }
public function flush(): void { /* ... */ }
}
// Set the cache before init() so all subsystems use it.
Queuety::set_cache( new RedisCache() );
Queuety::init( $connection );
إذا استُدعيت set_cache() قبل init()، فسيُتخطى الاكتشاف التلقائي للمصنع بالكامل وتُستخدم واجهتك الخلفية المخصصة.
الوصول إلى ذاكرة التخزين المؤقت
استرجع مثيل ذاكرة التخزين المؤقت النشط في أي وقت:
$cache = Queuety::cache();
$cache->set( 'my_key', 'my_value', 60 );
$value = $cache->get( 'my_key' );
يعيد هذا أي واجهة خلفية نشطة حاليًا (MemoryCache أو ApcuCache أو تنفيذك المخصص).