1 <sect1 id="zend.cache.introduction">
4 <code>Zend_Cache</code> يوفر إمكانية عمل cache للبيانات.
7 عملية الـ caching فى إطار عمل Zend يتم إدارتها من خلال مجموعة من الـ frontends فى حين ان سجلات الـ cache يتم حفظها
8 و استرجاعها عن طريق backend adapters مثل (<code>File</code>, <code>Sqlite</code>, <code>Memcache</code>...)
9 و يستخدم ايضا IDs و tags. بهذه الطريقة يكن من السهل حذف مجموعات محددة من السجلات بعد ذلك.
10 على سبيل المثال ("حذف كل سجلات الـ cache المعرفة بـ tag معين")
16 Core هو (<code>Zend_Cache_Core</code>) و هو يمثل المرونة و الشمولية و قابلية تعديل الخصائص (configurable).
17 حتى الأن يوجد مجموعة من الـ cache frontends تمتد عن <code>Zend_Cache_Core</code> و التى ستخدم احتياجاتك.
18 و هى : <code>Output</code>, <code>File</code>, <code>Function</code> و <code>Class</code>.
23 <title>إنشاء frontend بواسطة <code>()Zend_Cache::factory</code></title>
26 <code>()Zend_Cache::factory</code> ينشئ الـ objects المتوافقة معا و التى
27 ستحتاجها لإتمام عملك. فى هذا المثال, سنستخدم frontend و هو <code>Core</code>
28 و سنستخدم ايضا backend وهو <code>File</code>.
30 <programlisting role="php"><![CDATA[<?php
31 require_once 'Zend/Cache.php';
33 $frontendOptions = array(
34 'lifeTime' => 7200, // cache lifetime of 2 hours
35 'automaticSerialization' => true
38 $backendOptions = array(
39 'cacheDir' => './tmp/' // Directory where to put the cache files
42 // getting a Zend_Cache_Core object
43 $cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);
45 ?>]]></programlisting>
49 الأن لدينا frontend و أيضا يمكننا عمل cache لأى نوع من البيانات (لأننا قمنا بتشغيل الـ serialization ) .
50 على سبيل المثال , يمكننا عمل cache لبيانات ناتجة عن تنفيذ استعلام كبير على قاعدة بيانات .
51 بعد عمل cache لهذه البيانات, لن نحتاج الى ان نتصل حتى بقاعدة البيانات فى المرات القادمة; كل ما علينا
52 هو جلب هذه البيانات من الـ cache و استخدامها (سيتم عمل unserialization للبيانات ضمنيا ).
53 <programlisting role="php"><![CDATA[<?php
55 // $cache initialized in previous example
57 // see if a cache already exists:
58 if(!$result = $cache->load('myresult')) {
60 // cache miss; connect to the database
62 $db = Zend_Db::factory( [...] );
64 $result = $db->fetchAll('SELECT * FROM huge_table');
66 $cache->save($result, 'myresult');
70 // cache hit! shout so that we know
71 echo "This one is from cache!\n\n";
77 ?>]]></programlisting>
81 <title>عمل cache للخرج بإستخدام الـ Output frontend الخاصة بـ <code>Zend_Cache</code></title>
83 سنقوم بتحديد الأماكن التى نريد عمل cache لخرجها و ذلك بإستخدامنا لبعض الأكواد الشرطية,
84 سنضع بلوك الكود المحدد ما بين الـ method المسمى <code>()start</code> و الأخر المسمى <code>()end</code> .
85 ( هذا يعيد هيكلة المثال الأول و هذه هى الفكرة الأساسية للـ caching ).
87 بالداخل ستقوم بإخراج البيانات كالمعتاد, كل الخرج سيكن قد تم عمل cache له عندما يتم الوصول الى <code>()end</code> .
88 عند تشغيل هذا الكود مرة اخرى, لن يتم تنفيذ الكود المحدد فى هذا المكان لكن سيتم جلب البيانات من الـ cache
89 - و هذا طالما ان البيانات فى الـ cache مازالت قابلة للإستخدام .
90 <programlisting role="php"><![CDATA[<?php
92 $frontendOptions = array(
93 'lifeTime' => 30, // cache lifetime of half a minute
94 'automaticSerialization' => false // this is default anyway
97 $backendOptions = array('cacheDir' => './tmp/');
99 $cache = Zend_Cache::factory('Output', 'File', $frontendOptions, $backendOptions);
101 // we pass a unique identifier to the start() method
102 if(!$cache->start('mypage')) {
105 echo 'Hello world! ';
106 echo 'This is cached ('.time().') ';
108 $cache->end(); // the output is saved and sent to the browser
111 echo 'This is never cached ('.time().').';
113 ?>]]> </programlisting>
116 لاحظ اننا نقوم بإخراج ناتج الدالة <code>()time</code> مرتين; و هذا نستخدمه هنا فقط للتوضيح.
117 جرب ان تشغل هذا مرة ثم قم بإعادة تشغيله عدة مرات متتالية, ستلاحظ ان الرقم الأول لا يتغير و
118 لكن الرقم الثانى يتغير مع مرور الوقت, هذا لأن الرقم الأول تم اخراجه فى منطقة الـ cache المحددة فى الكود
119 و بالتالى تم حفظه فى الـ cache على عكس بقية البيانات المخرجة.
120 بعد نصف دقيقة سيصبح الرقمين متساويين لأن فترة صلاحية البيانات فى الـ cache قد انتهت
121 ( لقد قمنا بوضع قيمة lifeTime الى 30 ثانية ). و بهذا سيتم تحديث قيمة البيانات المخزنة فى الـ cache
122 من جديد. - جرب هذا بنفسك فى متصفحك لتفهم ما يحدث.
126 عند إستخدام Zend_Cache, ركز على إعطاء معرف مميز للـ cache (الذى تمرره الى
127 <code>()start</code> و <code>()save</code> ) و يجب الا يتكرر فى عمليات cache اخرى.
128 الوقوع فى هذا الخطأ سيسبب تداخل بين البيانات و اسوأ ما سيحدث هو أن هذه البيانات ستظهر فى اماكن ظهور بيانات أخرى.