| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- <sect1 id="zend.cache.introduction">
- <title>مقدمة</title>
- <para>
- <code>Zend_Cache</code>
- يوفر إمكانية عمل cache للبيانات.
- </para>
- <para>
- عملية الـ caching فى إطار عمل Zend يتم إدارتها من خلال مجموعة من الـ
- frontends فى حين ان سجلات الـ cache يتم حفظها
- و استرجاعها عن طريق backend adapters مثل (
- <code>File</code>
- ,
- <code>Sqlite</code>
- ,
- <code>Memcache</code>
- ...)
- و يستخدم ايضا IDs و tags. بهذه الطريقة يكن من السهل حذف مجموعات محددة
- من السجلات بعد ذلك.
- على سبيل المثال ("حذف كل سجلات الـ cache المعرفة بـ tag معين")
- </para>
- <para>
- Core هو (
- <code>Zend_Cache_Core</code>
- ) و هو يمثل المرونة و الشمولية و قابلية تعديل الخصائص (configurable).
- حتى الأن يوجد مجموعة من الـ cache frontends تمتد عن
- <code>Zend_Cache_Core</code>
- و التى ستخدم احتياجاتك.
- و هى :
- <code>Output</code>
- ,
- <code>File</code>
- ,
- <code>Function</code>
- و
- <code>Class</code>
- .
- </para>
- <example>
- <title>
- إنشاء frontend بواسطة
- <code>()Zend_Cache::factory</code>
- </title>
- <para>
- <code>()Zend_Cache::factory</code>
- ينشئ الـ objects المتوافقة معا و التى
- ستحتاجها لإتمام عملك. فى هذا المثال, سنستخدم frontend و هو
- <code>Core</code>
- و سنستخدم ايضا backend وهو
- <code>File</code>
- .
- <programlisting role="php"><![CDATA[<?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);
- ?>]]></programlisting>
- </para>
- <para>
- الأن لدينا frontend و أيضا يمكننا عمل cache لأى نوع من البيانات
- (لأننا قمنا بتشغيل الـ serialization ) .
- على سبيل المثال , يمكننا عمل cache لبيانات ناتجة عن تنفيذ استعلام كبير
- على قاعدة بيانات .
- بعد عمل cache لهذه البيانات, لن نحتاج الى ان نتصل حتى بقاعدة البيانات فى
- المرات القادمة; كل ما علينا
- هو جلب هذه البيانات من الـ cache و استخدامها (سيتم عمل unserialization
- للبيانات ضمنيا ).
- <programlisting role="php"><![CDATA[<?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);
- ?>]]></programlisting>
- </para>
- </example>
- <example>
- <title>
- عمل cache للخرج بإستخدام الـ Output frontend الخاصة بـ
- <code>Zend_Cache</code>
- </title>
- <para>
- سنقوم بتحديد الأماكن التى نريد عمل cache لخرجها و ذلك بإستخدامنا لبعض
- الأكواد الشرطية,
- سنضع بلوك الكود المحدد ما بين الـ method المسمى
- <code>()start</code>
- و الأخر المسمى
- <code>()end</code>
- .
- ( هذا يعيد هيكلة المثال الأول و هذه هى الفكرة الأساسية للـ caching ).
- </para>
- <para>
- بالداخل ستقوم بإخراج البيانات كالمعتاد, كل الخرج سيكن قد تم عمل cache
- له عندما يتم الوصول الى
- <code>()end</code>
- .
- عند تشغيل هذا الكود مرة اخرى, لن يتم تنفيذ الكود المحدد فى هذا المكان
- لكن سيتم جلب البيانات من الـ cache
- - و هذا طالما ان البيانات فى الـ cache مازالت قابلة للإستخدام .
- <programlisting role="php"><![CDATA[<?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().').';
- ?>]]>
- </programlisting>
- </para>
- <para>
- لاحظ اننا نقوم بإخراج ناتج الدالة
- <code>()time</code>
- مرتين; و هذا نستخدمه هنا فقط للتوضيح.
- جرب ان تشغل هذا مرة ثم قم بإعادة تشغيله عدة مرات متتالية, ستلاحظ ان
- الرقم الأول لا يتغير و
- لكن الرقم الثانى يتغير مع مرور الوقت, هذا لأن الرقم الأول تم اخراجه فى
- منطقة الـ cache المحددة فى الكود
- و بالتالى تم حفظه فى الـ cache على عكس بقية البيانات المخرجة.
- بعد نصف دقيقة سيصبح الرقمين متساويين لأن فترة صلاحية البيانات فى الـ
- cache قد انتهت
- ( لقد قمنا بوضع قيمة lifeTime الى 30 ثانية ). و بهذا سيتم تحديث قيمة
- البيانات المخزنة فى الـ cache
- من جديد. - جرب هذا بنفسك فى متصفحك لتفهم ما يحدث.
- </para>
- </example>
- <note>
- <para>
- عند إستخدام Zend_Cache, ركز على إعطاء معرف مميز للـ cache (الذى تمرره
- الى
- <code>()start</code>
- و
- <code>()save</code>
- ) و يجب الا يتكرر فى عمليات cache اخرى.
- الوقوع فى هذا الخطأ سيسبب تداخل بين البيانات و اسوأ ما سيحدث هو أن هذه
- البيانات ستظهر فى اماكن ظهور بيانات أخرى.
- </para>
- </note>
- </sect1>
- <!-- vim:se ts=4 sw=4 et: -->
|