1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235
|
<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="zend.memory.memory-objects">
<title>Objet mémoire</title>
<sect2 id="zend.memory.memory-objects.movable">
<title>Mobile</title>
<para>
Créer des objets mémoires mobiles en utilisant la méthode
<methodname>create([$data])</methodname> du manager de mémoire : <programlisting
role="php"><![CDATA[
$memObject = $memoryManager->create($data);
]]></programlisting></para>
<para>
"Mobile" signifie que de tels objets peuvent être mis en cache et déchargés de la
mémoire et chargés ensuite quand le code de l'application accède à l'objet.
</para>
</sect2>
<sect2 id="zend.memory.memory-objects.locked">
<title>Verrouillé</title>
<para>
Créer des objets mémoires verrouillés en utilisant la méthode
<methodname>createLocked([$data])</methodname> du manager de mémoire : <programlisting
role="php"><![CDATA[
$memObject = $memoryManager->createLocked($data);
]]></programlisting></para>
<para>
"Verrouillé" signifie que de tels objets ne sont jamais mis en cache et déchargés
de la mémoire.
</para>
<para>
Les objets verrouillés fournissent la même interface que des objets mobiles
(<classname>Zend_Memory_Container_Interface</classname>). Donc l'objet verrouillé peut
être utilisé en n'importe quel endroit à la place des objets mobiles.
</para>
<para>
Il est utile si une application ou un développeur peut décider, que quelques
objets ne devraient jamais être mis en cache, en se basant sur des considérations de
performance.
</para>
<para>
L'accès aux objets verrouillés est plus rapide, parce que le manager de mémoire ne
doit pas suivre à la trace des changements pour ces objets.
</para>
<para>
La classe d'objets verrouillés
(<classname>Zend_Memory_Container_Locked</classname>) garantit pratiquement la même
performance qu'en travaillant avec une variable de type chaîne de caractères. La couche
supérieure est un simple référence pour récupérer la propriété de classe.
</para>
</sect2>
<sect2 id="zend.memory.memory-objects.value">
<title>Propriété "value" du manager de mémoire</title>
<para>
Utilisez la propriété "<property>value</property>" du conteneur de mémoire (mobile ou
verrouillé) pour travailler avec les données des objets mémoire : <programlisting
role="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>
<para>
Une autre manière d'accéder aux données d'objet mémoire est d'utiliser la méthode
<link linkend="zend.memory.memory-objects.api.getRef"><methodname>getRef()</methodname></link>.
Cette méthode <emphasis>doit</emphasis> être utilisée pour les versions de <acronym>PHP</acronym>
inférieure à 5.2. Il devrait aussi être utilisé dans quelques autres cas pour des
raisons de performance.
</para>
</sect2>
<sect2 id="zend.memory.memory-objects.api">
<title>Interface du conteneur de mémoire</title>
<para>Le conteneur de mémoire fournit les méthodes suivantes :</para>
<sect3 id="zend.memory.memory-objects.api.getRef">
<title>La méthode getRef()</title>
<programlisting language="php"><![CDATA[
public function &getRef();
]]></programlisting>
<para>
La méthode <methodname>getRef()</methodname> retourne la référence vers une valeur
d'objet.
</para>
<para>
Des objets mobiles sont chargés du cache à ce moment si l'objet n'est pas déjà
dans la mémoire. Si l'objet est chargé du cache, cela pourrait entraîner la mise en
cache d'autres objets si la limite de mémoire était dépassée en ayant tous les
objets en mémoire.
</para>
<para>
La méthode <methodname>getRef()</methodname> <emphasis>doit</emphasis> être utilisée pour
accéder aux données d'objet mémoire si la version de <acronym>PHP</acronym> est inférieure à 5.2
</para>
<para>
Suivre à la trace les changements de ces données nécessitent des ressources
supplémentaires. La méthode <methodname>getRef()</methodname> retourne une référence à une
chaîne, qui est changé directement par l'utilisateur de l'application. Ainsi, c'est
une bonne idée d'utiliser la méthode <methodname>getRef()</methodname> pour le traitement des
données : <programlisting language="php"><![CDATA[
$memObject = $memoryManager->create($data);
$value = &$memObject->getRef();
for ($count = 0; $count < strlen($value); $count++) {
$char = $value[$count];
...
}
]]></programlisting></para>
</sect3>
<sect3 id="zend.memory.memory-objects.api.touch">
<title>La méthode touch()</title>
<programlisting language="php"><![CDATA[
public function touch();
]]></programlisting>
<para>
La méthode <methodname>touch()</methodname> devrait être employée en commun avec
<methodname>getRef()</methodname>. Elle signale que la valeur d'objet a été changé :
<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></para>
</sect3>
<sect3 id="zend.memory.memory-objects.api.lock">
<title>La méthode lock()</title>
<programlisting language="php"><![CDATA[
public function lock();
]]></programlisting>
<para>
La méthode <methodname>lock()</methodname> verrouille l'objet en mémoire. Elle devrait
être utilisé pour empêcher la mise en cache des objets que vous choisissez.
Normalement, ce n'est pas nécessaire, parce que le manager de mémoire utilise un
algorithme intelligent pour choisir des candidats à la mise en cache. Mais si vous
savez exactement, qu'à cette endroit du code certains objets ne devraient pas être
mis en cache, vous pouvez les verrouiller.
</para>
<para>
Le verrouillage d'objets dans la mémoire garantit aussi que la référence
retournée par la méthode <methodname>getRef()</methodname> est valable jusqu'à ce que vous
déverrouiller l'objet : <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></para>
</sect3>
<sect3 id="zend.memory.memory-objects.api.unlock">
<title>La méthode unlock()</title>
<programlisting language="php"><![CDATA[
public function unlock();
]]></programlisting>
<para>
La méthode <methodname>unlock()</methodname> déverrouille l'objet quand il n'est plus
nécessaire de maintenir verrouillé. Voir l'exemple ci-dessus.
</para>
</sect3>
<sect3 id="zend.memory.memory-objects.api.isLocked">
<title>La méthode isLocked()</title>
<programlisting language="php"><![CDATA[
public function isLocked();
]]></programlisting>
<para>
La méthode <methodname>isLocked()</methodname> peut être utilisée pour vérifier si l'objet
est verrouillé. Il retourne <constant>TRUE</constant> si l'objet est verrouillé, ou
<constant>FALSE</constant> s'il n'est pas verrouillé. C'est toujours <constant>TRUE</constant> pour
les objets "verrouillés" et peut être <constant>TRUE</constant> ou <constant>FALSE</constant> pour
des objets "mobiles".
</para>
</sect3>
</sect2>
</sect1>
|