| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 24249 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.memory.memory-objects">
- <title>Memory Objekte</title>
- <sect2 id="zend.memory.memory-objects.movable">
- <title>Verschiebbar</title>
- <para>
- Um verschiebbare Memory Objekte zu Erstellen kann die
- <methodname>create([$data])</methodname> Methode des Memory Managers verwendet werden:
- </para>
- <programlisting language="php"><![CDATA[
- $memObject = $memoryManager->create($data);
- ]]></programlisting>
- <para>
- "Verschiebbar" bedeutet das solche Objekte verschoben und von Speicher
- entfernt werden können und wieder geladen werden wenn der Code der
- Anwendung auf das Objekt wieder zugreift.
- </para>
- </sect2>
- <sect2 id="zend.memory.memory-objects.locked">
- <title>Gesperrt</title>
- <para>
- Gesperrte Memory Objekte können erstellt werden mit Hilfe der
- <methodname>createLocked([$data])</methodname> Methode des Memory Managers:
- </para>
- <programlisting language="php"><![CDATA[
- $memObject = $memoryManager->createLocked($data);
- ]]></programlisting>
- <para>
- "Gesperrt" bedeutet das solche Objekte niemals getauscht und vom Speicher
- entfernt werden.
- </para>
- <para>
- Gesperrte Objekte haben das selbe Interface wie verschiebbare Objekte
- (<classname>Zend_Memory_Container_Interface</classname>).
- Deswegen können gesperrte Objekte an jedem Platz statt verschiebbaren
- Objekten verwendet werden.
- </para>
- <para>
- Es ist nützlich wenn eine Anwendung oder Entwickler entscheiden kann, das
- einige Objekte niemals getauscht werden sollen, basierend auf
- Entscheidungen der Geschwindigkeit.
- </para>
- <para>
- Der Zugriff auf gesperrte Objekte ist schneller, weil der Memory Manager
- die Änderungen für diese Objekte nicht verfolgen muß.
- </para>
- <para>
- Die Klasse der gelockten Objekte (<classname>Zend_Memory_Container_Locked</classname>)
- garantiert virtuell die selbe Performance wie das Arbeiten mit einer
- Zeichenketten Variablen. Der Overhead ist ein einzelnes De-Referenzieren um
- die Eigenschaft der Klasse zu erhalten.
- </para>
- </sect2>
- <sect2 id="zend.memory.memory-objects.value">
- <title>Memory Container 'value' Eigenschaft</title>
- <para>
- Die '<property>value</property>' Eigenschaft des Memory Containers (gesperrt oder
- verschiebbar) kann verwendet werden um mit Memory Objekt Daten zu arbeiten:
- </para>
- <programlisting language="php"><![CDATA[
- $memObject = $memoryManager->create($data);
- echo $memObject->value;
- $memObject->value = $newValue;
- $memObject->value[$index] = '_';
- echo ord($memObject->value[$index1]);
- $memObject->value = substr($memObject->value, $start, $length);
- ]]></programlisting>
- <para>
- Ein alternaviter Weg um auf die Daten des Memory Objektes zuzugreifen
- ist die Verwendung der <link
- linkend="zend.memory.memory-objects.api.getRef"><methodname>getRef()</methodname></link>
- Methode. Diese Methode <emphasis>muß</emphasis> verwendet werden für
- <acronym>PHP</acronym> Versionen vor 5.2. Sie könnte auch in einigen Fällen verwendet
- werden, wenn Gründe der Geschwindigkeit dafür sprechen.
- </para>
- </sect2>
- <sect2 id="zend.memory.memory-objects.api">
- <title>Memory Container Interface</title>
- <para>
- Der Memory Container stellt die folgenden Methoden zur Verfügung:
- </para>
- <sect3 id="zend.memory.memory-objects.api.getRef">
- <title>getRef() Methode</title>
- <programlisting language="php"><![CDATA[
- public function &getRef();
- ]]></programlisting>
- <para>
- Die <methodname>getRef()</methodname> Methode gibt eine Referenz auf den Wert
- des Objektes zurück.
- </para>
- <para>
- Verschiebbare Objekte werden vom Cache geladen in dem Moment wenn das
- Objekt nicht bereits im Speicher vorhanden ist. Wenn das Objekt
- vom Cache geladen wird, können das einen Tausch von anderen Objekten
- verursachen wenn das Memory Limit überschritten werden würde wenn alle
- gemanageten Objekte im Speicher vorhanden sind.
- </para>
- <para>
- Die <methodname>getRef()</methodname> Methode <emphasis>muß</emphasis> verwendet
- werden um auf die Daten des Memory Objektes zuzugreifen für
- <acronym>PHP</acronym> Versionen vor 5.2.
- </para>
- <para>
- Das Verfolgen von Änderungen an Daten benötigt zusätzliche Ressourcen.
- Die <methodname>getRef()</methodname> Methode gibt eine Referenz zu der
- Zeichenkette zurück, welches direkt von der Benutzeranwendung
- verändert wird. Deswegen ist es eine gute Idee die
- <methodname>getRef()</methodname> Methode für den Zugriff auf die Werte der Daten
- zu verwenden:
- </para>
- <programlisting language="php"><![CDATA[
- $memObject = $memoryManager->create($data);
- $value = &$memObject->getRef();
- for ($count = 0; $count < strlen($value); $count++) {
- $char = $value[$count];
- ...
- }
- ]]></programlisting>
- </sect3>
- <sect3 id="zend.memory.memory-objects.api.touch">
- <title>touch() Methode</title>
- <programlisting language="php"><![CDATA[
- public function touch();
- ]]></programlisting>
- <para>
- Die <methodname>touch()</methodname> Methode sollte in Verbindung mit
- <methodname>getRef()</methodname> verwendet werden. Das signalisiert das der
- Wert des Objektes sich verändert hat:
- </para>
- <programlisting language="php"><![CDATA[
- $memObject = $memoryManager->create($data);
- ...
- $value = &$memObject->getRef();
- for ($count = 0; $count < strlen($value); $count++) {
- ...
- if ($condition) {
- $value[$count] = $char;
- }
- ...
- }
- $memObject->touch();
- ]]></programlisting>
- </sect3>
- <sect3 id="zend.memory.memory-objects.api.lock">
- <title>lock() Methode</title>
- <programlisting language="php"><![CDATA[
- public function lock();
- ]]></programlisting>
- <para>
- Die <methodname>lock()</methodname> Methode versperrt Objekte im Speicher.
- Sie sollte verwendet werden um das tauschen von ausgewählten
- Objekten zu verhindern. Normalerweise ist das nicht notwendig,
- da der Memory Manager einen intelligenten Algorythmus verwendet
- um Kandidaten für den Tasuch zu eruieren. Aber wenn genau bekannt ist,
- das ein bestimmter Teil des Codes nicht getauscht werden sollte, kann
- er gesperrt werden.
- </para>
- <para>
- Gesperrte Objekte im Speicher garantieren auch das die Referent die
- durch die <methodname>getRef()</methodname> Methode zurückgegeben wird gültig ist
- bis das Objekt entsperrt wird:
- </para>
- <programlisting language="php"><![CDATA[
- $memObject1 = $memoryManager->create($data1);
- $memObject2 = $memoryManager->create($data2);
- ...
- $memObject1->lock();
- $memObject2->lock();
- $value1 = &$memObject1->getRef();
- $value2 = &$memObject2->getRef();
- for ($count = 0; $count < strlen($value2); $count++) {
- $value1 .= $value2[$count];
- }
- $memObject1->touch();
- $memObject1->unlock();
- $memObject2->unlock();
- ]]></programlisting>
- </sect3>
- <sect3 id="zend.memory.memory-objects.api.unlock">
- <title>unlock() Methode</title>
- <programlisting language="php"><![CDATA[
- public function unlock();
- ]]></programlisting>
- <para>
- Die <methodname>unlock()</methodname> Methode entsperrt Objekte wenn es nicht mehr
- notwendig ist diese zu sperren. Siehe das obige Beispiel.
- </para>
- </sect3>
- <sect3 id="zend.memory.memory-objects.api.isLocked">
- <title>isLocked() Methode</title>
- <programlisting language="php"><![CDATA[
- public function isLocked();
- ]]></programlisting>
- <para>
- Die <methodname>isLocked()</methodname> Methode kann verwendet werden um zu
- Prüfen ob das Objekt gesperrt ist. Sie gibt <constant>TRUE</constant>
- zurück wenn das Objekt gesperrt ist, oder <constant>FALSE</constant> wenn
- es nicht gesperrt ist. Für "gesperrte" Objekte wird immer
- <constant>TRUE</constant> zurückgegeben, und für "verschiebbare" Objekte
- kann entweder <constant>TRUE</constant> oder <constant>FALSE</constant>
- zurückgegeben werden.
- </para>
- </sect3>
- </sect2>
- </sect1>
|