Zend_Memory-MemoryObjects.xml 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15103 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.memory.memory-objects">
  5. <title>Memory Objekte</title>
  6. <sect2 id="zend.memory.memory-objects.movable">
  7. <title>Verschiebbar</title>
  8. <para>
  9. Um verschiebbare Memory Objekte zu Erstellen kann die <code>create([$data])</code>
  10. Methode des Memory Managers verwendet werden:
  11. <programlisting role="php"><![CDATA[
  12. $memObject = $memoryManager->create($data);
  13. ]]>
  14. </programlisting>
  15. </para>
  16. <para>
  17. "Verschiebbar" bedeutet das solche Objekte verschoben und von Speicher
  18. entfernt werden können und wieder geladen werden wenn der Code der
  19. Anwendung auf das Objekt wieder zugreift.
  20. </para>
  21. </sect2>
  22. <sect2 id="zend.memory.memory-objects.locked">
  23. <title>Gesperrt</title>
  24. <para>
  25. Gesperrte Memory Objekte können erstellt werden mit Hilfe der
  26. <code>createLocked([$data])</code> Methode des Memory Managers:
  27. <programlisting role="php"><![CDATA[
  28. $memObject = $memoryManager->createLocked($data);
  29. ]]>
  30. </programlisting>
  31. </para>
  32. <para>
  33. "Gesperrt" bedeutet das solche Objekte niemals getauscht und vom Speicher
  34. entfernt werden.
  35. </para>
  36. <para>
  37. Gesperrte Objekte haben das selbe Interface wie verschiebbare Objekte
  38. (<classname>Zend_Memory_Container_Interface</classname>).
  39. Deswegen können gesperrte Objekte an jedem Platz statt verschiebbaren
  40. Objekten verwendet werden.
  41. </para>
  42. <para>
  43. Es ist nützlich wenn eine Anwendung oder Entwickler entscheiden kann, das
  44. einige Objekte niemals getauscht werden sollen, basierend auf
  45. Entscheidungen der Geschwindigkeit.
  46. </para>
  47. <para>
  48. Der Zugriff auf gesperrte Objekte ist schneller, weil der Memory Manager
  49. die Änderungen für diese Objekte nicht verfolgen muß.
  50. </para>
  51. <para>
  52. Die Klasse der gelockten Objekte (<classname>Zend_Memory_Container_Locked</classname>)
  53. garantiert virtuell die selbe Performance wie das Arbeiten mit einer
  54. Zeichenketten Variablen. Der Overhead ist ein einzelnes De-Referenzieren um
  55. die Eigenschaft der Klasse zu erhalten.
  56. </para>
  57. </sect2>
  58. <sect2 id="zend.memory.memory-objects.value">
  59. <title>Memory Container 'value' Eigenschaft.</title>
  60. <para>
  61. Die '<code>value</code>' Eigenschaft des Memory Containers (gesperrt oder verschiebbar)
  62. kann verwendet werden um mit Memory Objekt Daten zu arbeiten:
  63. <programlisting role="php"><![CDATA[
  64. $memObject = $memoryManager->create($data);
  65. echo $memObject->value;
  66. $memObject->value = $newValue;
  67. $memObject->value[$index] = '_';
  68. echo ord($memObject->value[$index1]);
  69. $memObject->value = substr($memObject->value, $start, $length);
  70. ]]>
  71. </programlisting>
  72. </para>
  73. <para>
  74. Ein alternaviter Weg um auf die Daten des Memory Objektes zuzugreifen
  75. ist die Verwendung der
  76. <link linkend="zend.memory.memory-objects.api.getRef"><code>getRef()</code></link>
  77. Methode. Diese Methode <emphasis>muß</emphasis> verwendet werden für PHP
  78. Versionen vor 5.2. Sie könnte auch in einigen Fällen verwendet werden,
  79. wenn Gründe der Geschwindigkeit dafür sprechen.
  80. </para>
  81. </sect2>
  82. <sect2 id="zend.memory.memory-objects.api">
  83. <title>Memory Container Interface</title>
  84. <para>
  85. Der Memory Container stellt die folgenden Methoden zur Verfügung:
  86. </para>
  87. <sect3 id="zend.memory.memory-objects.api.getRef">
  88. <title>getRef() Methode</title>
  89. <programlisting role="php"><![CDATA[
  90. public function &getRef();
  91. ]]>
  92. </programlisting>
  93. <para>
  94. Die <code>getRef()</code> Methode gibt eine Referenz auf den Wert
  95. des Objektes zurück.
  96. </para>
  97. <para>
  98. Verschiebbare Objekte werden vom Cache geladen in dem Moment wenn das
  99. Objekt nicht bereits im Speicher vorhanden ist. Wenn das Objekt
  100. vom Cache geladen wird, können das einen Tausch von anderen Objekten
  101. verursachen wenn das Memory Limit überschritten werden würde wenn alle
  102. gemanageten Objekte im Speicher vorhanden sind.
  103. </para>
  104. <para>
  105. Die <code>getRef()</code> Methode <emphasis>muß</emphasis> verwendet
  106. werden um auf die Daten des Memory Objektes zuzugreifen für
  107. PHP Versionen vor 5.2.
  108. </para>
  109. <para>
  110. Das Verfolgen von Änderungen an Daten benötigt zusätzliche Ressourcen.
  111. Die <code>getRef()</code> Methode gibt eine Referenz zu der
  112. Zeichenkette zurück, welches direkt von der Benutzeranwendung
  113. verändert wird. Deswegen ist es eine gute Idee die
  114. <code>getRef()</code> Methode für den Zugriff auf die Werte der Daten
  115. zu verwenden:
  116. <programlisting role="php"><![CDATA[
  117. $memObject = $memoryManager->create($data);
  118. $value = &$memObject->getRef();
  119. for ($count = 0; $count < strlen($value); $count++) {
  120. $char = $value[$count];
  121. ...
  122. }
  123. ]]>
  124. </programlisting>
  125. </para>
  126. </sect3>
  127. <sect3 id="zend.memory.memory-objects.api.touch">
  128. <title>touch() Methode</title>
  129. <programlisting role="php"><![CDATA[
  130. public function touch();
  131. ]]>
  132. </programlisting>
  133. <para>
  134. Die <code>touch()</code> Methode sollte in Verbindung mit
  135. <code>getRef()</code> verwendet werden. Das signalisiert das der
  136. Wert des Objektes sich verändert hat:
  137. <programlisting role="php"><![CDATA[
  138. $memObject = $memoryManager->create($data);
  139. ...
  140. $value = &$memObject->getRef();
  141. for ($count = 0; $count < strlen($value); $count++) {
  142. ...
  143. if ($condition) {
  144. $value[$count] = $char;
  145. }
  146. ...
  147. }
  148. $memObject->touch();
  149. ]]>
  150. </programlisting>
  151. </para>
  152. </sect3>
  153. <sect3 id="zend.memory.memory-objects.api.lock">
  154. <title>lock() Methode</title>
  155. <programlisting role="php"><![CDATA[
  156. public function lock();
  157. ]]>
  158. </programlisting>
  159. <para>
  160. Die <code>lock()</code> Methode versperrt Objekte im Speicher.
  161. Sie sollte verwendet werden um das tauschen von ausgewählten
  162. Objekten zu verhindern. Normalerweise ist das nicht notwendig,
  163. da der Memory Manager einen intelligenten Algorythmus verwendet
  164. um Kandidaten für den Tasuch zu eruieren. Aber wenn genau bekannt ist,
  165. das ein bestimmter Teil des Codes nicht getauscht werden sollte, kann
  166. er gesperrt werden.
  167. </para>
  168. <para>
  169. Gesperrte Objekte im Speicher garantieren auch das die Referent die
  170. durch die <code>getRef()</code> Methode zurückgegeben wird gültig ist
  171. bis das Objekt entsperrt wird:
  172. <programlisting role="php"><![CDATA[
  173. $memObject1 = $memoryManager->create($data1);
  174. $memObject2 = $memoryManager->create($data2);
  175. ...
  176. $memObject1->lock();
  177. $memObject2->lock();
  178. $value1 = &$memObject1->getRef();
  179. $value2 = &$memObject2->getRef();
  180. for ($count = 0; $count < strlen($value2); $count++) {
  181. $value1 .= $value2[$count];
  182. }
  183. $memObject1->touch();
  184. $memObject1->unlock();
  185. $memObject2->unlock();
  186. ]]>
  187. </programlisting>
  188. </para>
  189. </sect3>
  190. <sect3 id="zend.memory.memory-objects.api.unlock">
  191. <title>unlock() Methode</title>
  192. <programlisting role="php"><![CDATA[
  193. public function unlock();
  194. ]]>
  195. </programlisting>
  196. <para>
  197. Die <code>unlock()</code> Methode entsperrt Objekte wenn es nicht mehr
  198. notwendig ist diese zu sperren. Siehe das obige Beispiel.
  199. </para>
  200. </sect3>
  201. <sect3 id="zend.memory.memory-objects.api.isLocked">
  202. <title>isLocked() Methode</title>
  203. <programlisting role="php"><![CDATA[
  204. public function isLocked();
  205. ]]>
  206. </programlisting>
  207. <para>
  208. Die <code>isLocked()</code> Methode kann verwendet werden um zu
  209. Prüfen ob das Objekt gesperrt ist. Sie gibt <code>true</code>
  210. zurück wenn das Objekt gesperrt ist, oder <code>false</code> wenn
  211. es nicht gesperrt ist. Für "gesperrte" Objekte wird immer
  212. <code>true</code> zurückgegeben, und für "verschiebbare" Objekte
  213. kann entweder <code>true</code> oder <code>false</code>
  214. zurückgegeben werden.
  215. </para>
  216. </sect3>
  217. </sect2>
  218. </sect1>