Zend_Cache-Introduction.xml 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. <sect1 id="zend.cache.introduction">
  2. <title>مقدمة</title>
  3. <para>
  4. <code>Zend_Cache</code> يوفر إمكانية عمل cache للبيانات.
  5. </para>
  6. <para>
  7. عملية الـ caching فى إطار عمل Zend يتم إدارتها من خلال مجموعة من الـ frontends فى حين ان سجلات الـ cache يتم حفظها
  8. و استرجاعها عن طريق backend adapters مثل (<code>File</code>, <code>Sqlite</code>, <code>Memcache</code>...)
  9. و يستخدم ايضا IDs و tags. بهذه الطريقة يكن من السهل حذف مجموعات محددة من السجلات بعد ذلك.
  10. على سبيل المثال ("حذف كل سجلات الـ cache المعرفة بـ tag معين")
  11. </para>
  12. <para>
  13. Core هو (<code>Zend_Cache_Core</code>) و هو يمثل المرونة و الشمولية و قابلية تعديل الخصائص (configurable).
  14. حتى الأن يوجد مجموعة من الـ cache frontends تمتد عن <code>Zend_Cache_Core</code> و التى ستخدم احتياجاتك.
  15. و هى : <code>Output</code>, <code>File</code>, <code>Function</code> و <code>Class</code>.
  16. </para>
  17. <example>
  18. <title>إنشاء frontend بواسطة <code>()Zend_Cache::factory</code></title>
  19. <para>
  20. <code>()Zend_Cache::factory</code> ينشئ الـ objects المتوافقة معا و التى
  21. ستحتاجها لإتمام عملك. فى هذا المثال, سنستخدم frontend و هو <code>Core</code>
  22. و سنستخدم ايضا backend وهو <code>File</code>.
  23. <programlisting role="php"><![CDATA[<?php
  24. require_once 'Zend/Cache.php';
  25. $frontendOptions = array(
  26. 'lifeTime' => 7200, // cache lifetime of 2 hours
  27. 'automaticSerialization' => true
  28. );
  29. $backendOptions = array(
  30. 'cacheDir' => './tmp/' // Directory where to put the cache files
  31. );
  32. // getting a Zend_Cache_Core object
  33. $cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);
  34. ?>]]></programlisting>
  35. </para>
  36. <para>
  37. الأن لدينا frontend و أيضا يمكننا عمل cache لأى نوع من البيانات (لأننا قمنا بتشغيل الـ serialization ) .
  38. على سبيل المثال , يمكننا عمل cache لبيانات ناتجة عن تنفيذ استعلام كبير على قاعدة بيانات .
  39. بعد عمل cache لهذه البيانات, لن نحتاج الى ان نتصل حتى بقاعدة البيانات فى المرات القادمة; كل ما علينا
  40. هو جلب هذه البيانات من الـ cache و استخدامها (سيتم عمل unserialization للبيانات ضمنيا ).
  41. <programlisting role="php"><![CDATA[<?php
  42. // $cache initialized in previous example
  43. // see if a cache already exists:
  44. if(!$result = $cache->load('myresult')) {
  45. // cache miss; connect to the database
  46. $db = Zend_Db::factory( [...] );
  47. $result = $db->fetchAll('SELECT * FROM huge_table');
  48. $cache->save($result, 'myresult');
  49. } else {
  50. // cache hit! shout so that we know
  51. echo "This one is from cache!\n\n";
  52. }
  53. print_r($result);
  54. ?>]]></programlisting>
  55. </para>
  56. </example>
  57. <example>
  58. <title>عمل cache للخرج بإستخدام الـ Output frontend الخاصة بـ <code>Zend_Cache</code></title>
  59. <para>
  60. سنقوم بتحديد الأماكن التى نريد عمل cache لخرجها و ذلك بإستخدامنا لبعض الأكواد الشرطية,
  61. سنضع بلوك الكود المحدد ما بين الـ method المسمى <code>()start</code> و الأخر المسمى <code>()end</code> .
  62. ( هذا يعيد هيكلة المثال الأول و هذه هى الفكرة الأساسية للـ caching ).
  63. </para><para>
  64. بالداخل ستقوم بإخراج البيانات كالمعتاد, كل الخرج سيكن قد تم عمل cache له عندما يتم الوصول الى <code>()end</code> .
  65. عند تشغيل هذا الكود مرة اخرى, لن يتم تنفيذ الكود المحدد فى هذا المكان لكن سيتم جلب البيانات من الـ cache
  66. - و هذا طالما ان البيانات فى الـ cache مازالت قابلة للإستخدام .
  67. <programlisting role="php"><![CDATA[<?php
  68. $frontendOptions = array(
  69. 'lifeTime' => 30, // cache lifetime of half a minute
  70. 'automaticSerialization' => false // this is default anyway
  71. );
  72. $backendOptions = array('cacheDir' => './tmp/');
  73. $cache = Zend_Cache::factory('Output', 'File', $frontendOptions, $backendOptions);
  74. // we pass a unique identifier to the start() method
  75. if(!$cache->start('mypage')) {
  76. // output as usual:
  77. echo 'Hello world! ';
  78. echo 'This is cached ('.time().') ';
  79. $cache->end(); // the output is saved and sent to the browser
  80. }
  81. echo 'This is never cached ('.time().').';
  82. ?>]]> </programlisting>
  83. </para>
  84. <para>
  85. لاحظ اننا نقوم بإخراج ناتج الدالة <code>()time</code> مرتين; و هذا نستخدمه هنا فقط للتوضيح.
  86. جرب ان تشغل هذا مرة ثم قم بإعادة تشغيله عدة مرات متتالية, ستلاحظ ان الرقم الأول لا يتغير و
  87. لكن الرقم الثانى يتغير مع مرور الوقت, هذا لأن الرقم الأول تم اخراجه فى منطقة الـ cache المحددة فى الكود
  88. و بالتالى تم حفظه فى الـ cache على عكس بقية البيانات المخرجة.
  89. بعد نصف دقيقة سيصبح الرقمين متساويين لأن فترة صلاحية البيانات فى الـ cache قد انتهت
  90. ( لقد قمنا بوضع قيمة lifeTime الى 30 ثانية ). و بهذا سيتم تحديث قيمة البيانات المخزنة فى الـ cache
  91. من جديد. - جرب هذا بنفسك فى متصفحك لتفهم ما يحدث.
  92. </para>
  93. </example>
  94. <note><para>
  95. عند إستخدام Zend_Cache, ركز على إعطاء معرف مميز للـ cache (الذى تمرره الى
  96. <code>()start</code> و <code>()save</code> ) و يجب الا يتكرر فى عمليات cache اخرى.
  97. الوقوع فى هذا الخطأ سيسبب تداخل بين البيانات و اسوأ ما سيحدث هو أن هذه البيانات ستظهر فى اماكن ظهور بيانات أخرى.
  98. </para></note>
  99. </sect1>
  100. <!--
  101. vim:se ts=4 sw=4 et:
  102. -->