قائمة المحتويات
Zend_Cache
يوفر إمكانية عمل cache للبيانات.
عملية الـ caching فى إطار عمل Zend يتم إدارتها من خلال مجموعة من الـ frontends فى حين ان سجلات الـ cache يتم حفظها
و استرجاعها عن طريق backend adapters مثل (File
, Sqlite
, Memcache
...)
و يستخدم ايضا IDs و tags. بهذه الطريقة يكن من السهل حذف مجموعات محددة من السجلات بعد ذلك.
على سبيل المثال ("حذف كل سجلات الـ cache المعرفة بـ tag معين")
Core هو (Zend_Cache_Core
) و هو يمثل المرونة و الشمولية و قابلية تعديل الخصائص (configurable).
حتى الأن يوجد مجموعة من الـ cache frontends تمتد عن Zend_Cache_Core
و التى ستخدم احتياجاتك.
و هى : Output
, File
, Function
و Class
.
مثال 4.1. إنشاء frontend بواسطة ()Zend_Cache::factory
()Zend_Cache::factory
ينشئ الـ objects المتوافقة معا و التى
ستحتاجها لإتمام عملك. فى هذا المثال, سنستخدم frontend و هو Core
و سنستخدم ايضا backend وهو File
.
<?php require_once 'Zend/Cache.php'; $frontendOptions = array( 'lifeTime' => 7200, // cache lifetime of 2 hours 'automaticSerialization' => true ); $backendOptions = array( 'cacheDir' => './tmp/' // Directory where to put the cache files ); // getting a Zend_Cache_Core object $cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions); ?>
الأن لدينا frontend و أيضا يمكننا عمل cache لأى نوع من البيانات (لأننا قمنا بتشغيل الـ serialization ) . على سبيل المثال , يمكننا عمل cache لبيانات ناتجة عن تنفيذ استعلام كبير على قاعدة بيانات . بعد عمل cache لهذه البيانات, لن نحتاج الى ان نتصل حتى بقاعدة البيانات فى المرات القادمة; كل ما علينا هو جلب هذه البيانات من الـ cache و استخدامها (سيتم عمل unserialization للبيانات ضمنيا ).
<?php // $cache initialized in previous example // see if a cache already exists: if(!$result = $cache->load('myresult')) { // cache miss; connect to the database $db = Zend_Db::factory( [...] ); $result = $db->fetchAll('SELECT * FROM huge_table'); $cache->save($result, 'myresult'); } else { // cache hit! shout so that we know echo "This one is from cache!\n\n"; } print_r($result); ?>
مثال 4.2. عمل cache للخرج بإستخدام الـ Output frontend الخاصة بـ Zend_Cache
سنقوم بتحديد الأماكن التى نريد عمل cache لخرجها و ذلك بإستخدامنا لبعض الأكواد الشرطية,
سنضع بلوك الكود المحدد ما بين الـ method المسمى ()start
و الأخر المسمى ()end
.
( هذا يعيد هيكلة المثال الأول و هذه هى الفكرة الأساسية للـ caching ).
بالداخل ستقوم بإخراج البيانات كالمعتاد, كل الخرج سيكن قد تم عمل cache له عندما يتم الوصول الى ()end
.
عند تشغيل هذا الكود مرة اخرى, لن يتم تنفيذ الكود المحدد فى هذا المكان لكن سيتم جلب البيانات من الـ cache
- و هذا طالما ان البيانات فى الـ cache مازالت قابلة للإستخدام .
<?php $frontendOptions = array( 'lifeTime' => 30, // cache lifetime of half a minute 'automaticSerialization' => false // this is default anyway ); $backendOptions = array('cacheDir' => './tmp/'); $cache = Zend_Cache::factory('Output', 'File', $frontendOptions, $backendOptions); // we pass a unique identifier to the start() method if(!$cache->start('mypage')) { // output as usual: echo 'Hello world! '; echo 'This is cached ('.time().') '; $cache->end(); // the output is saved and sent to the browser } echo 'This is never cached ('.time().').'; ?>
لاحظ اننا نقوم بإخراج ناتج الدالة ()time
مرتين; و هذا نستخدمه هنا فقط للتوضيح.
جرب ان تشغل هذا مرة ثم قم بإعادة تشغيله عدة مرات متتالية, ستلاحظ ان الرقم الأول لا يتغير و
لكن الرقم الثانى يتغير مع مرور الوقت, هذا لأن الرقم الأول تم اخراجه فى منطقة الـ cache المحددة فى الكود
و بالتالى تم حفظه فى الـ cache على عكس بقية البيانات المخرجة.
بعد نصف دقيقة سيصبح الرقمين متساويين لأن فترة صلاحية البيانات فى الـ cache قد انتهت
( لقد قمنا بوضع قيمة lifeTime الى 30 ثانية ). و بهذا سيتم تحديث قيمة البيانات المخزنة فى الـ cache
من جديد. - جرب هذا بنفسك فى متصفحك لتفهم ما يحدث.
ملاحظة | |
---|---|
عند إستخدام Zend_Cache, ركز على إعطاء معرف مميز للـ cache (الذى تمرره الى
|