<!-- EN-Revision: 13838 -->
<sect1 id="zend.memory.overview">
    <title>Présentation</title>

    <sect2 id="zend.memory.introduction">
        <title>Introduction</title>

        <para>Le composant <classname>Zend_Memory</classname> est destiné à gérer des données dans un environnement où la mémoire
        est limitée.</para>

        <para>Les objets mémoire (conteneurs de mémoire) sont produits par le manager de mémoire sur demande et mis en
        cache/chargés d'une manière transparente quand c'est nécessaire.</para>

        <para>Par exemple, si la création ou le chargement d'un objet entraîne une utilisation de mémoire totale
        excédant la limite que vous spécifiez, certains objets gérés sont copiés en cache à l'extérieur de la mémoire.
        De cette façon, la mémoire totale utilisée par les objets gérés n'excède pas la limite que vous devez mettre en
        application.</para>

        <para>Le manager de mémoire utilise les <link linkend="zend.cache.backends">backends Zend_Cache</link> comme
        fournisseurs de stockage.</para>

        <example id="zend.memory.introduction.example-1">
            <title>Utiliser le composant Zend_Memory</title>

            <para><classname>Zend_Memory::factory()</classname> instancie l'objet de management de la mémoire avec les options
            spécifiques du backend.</para>

            <programlisting role="php"><![CDATA[
$backendOptions = array(
    'cache_dir' => './tmp/'
    // Dossier où les blocks de mémoire peuvent être stockés
);

$memoryManager = Zend_Memory::factory('File', $backendOptions);

$loadedFiles = array();

for ($count = 0; $count < 10000; $count++) {
    $f = fopen($fileNames[$count], 'rb');
    $data = fread($f, filesize($fileNames[$count]));
    $fclose($f);

    $loadedFiles[] = $memoryManager->create($data);
}

echo $loadedFiles[$index1]->value;

$loadedFiles[$index2]->value = $newValue;

$loadedFiles[$index3]->value[$charIndex] = '_';
]]></programlisting>
        </example>
    </sect2>

    <sect2 id="zend.memory.theory-of-operation">
        <title>Aspect théorique</title>

        <para><classname>Zend_Memory</classname> travaille avec les concepts suivants : <itemizedlist>
                <listitem>
                    <para>Manager de mémoire</para>
                </listitem>

                <listitem>
                    <para>Conteneur de mémoire</para>
                </listitem>

                <listitem>
                    <para>Objet de mémoire verrouillé</para>
                </listitem>

                <listitem>
                    <para>Objet de mémoire mobile</para>
                </listitem>
            </itemizedlist></para>

        <sect3 id="zend.memory.theory-of-operation.manager">
            <title>Manager de mémoire</title>

            <para>Le manager de mémoire produit des objets de mémoire (verrouillé ou mobile) sur demande de
            l'utilisateur et les retourne encapsulé dans un objet conteneur de mémoire.</para>
        </sect3>

        <sect3 id="zend.memory.theory-of-operation.container">
            <title>Conteneur de mémoire</title>

            <para>Le conteneur de mémoire a un attribut <code>value</code> virtuel ou réel de type chaîne de caractères.
            Cet attribut contient la valeur de donnée indiquée au moment de la création de l'objet mémoire.</para>

            <para>Vous pouvez exploiter cet attribut <code>value</code> comme une propriété d'objet : <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>

            <note>
                <para>Si vous utilisez une version de PHP inférieure à 5.2, utilisez la méthode <link
                linkend="zend.memory.memory-objects.api.getRef">getRef()</link> au lieu d'accéder directement à la
                valeur de la propriété.</para>
            </note>
        </sect3>

        <sect3 id="zend.memory.theory-of-operation.locked">
            <title>Objet de mémoire verrouillé</title>

            <para>Les objets de mémoire verrouillés sont toujours stockés dans la mémoire. Les données stockées dans la
            mémoire verrouillée ne sont jamais mis en cache.</para>
        </sect3>

        <sect3 id="zend.memory.theory-of-operation.movable">
            <title>Objet de mémoire mobile</title>

            <para>Les objets de mémoire mobiles sont mis en cache et chargés de manière transparente de/vers le cache
            par <classname>Zend_Memory</classname> si c'est nécessaire.</para>

            <para>Le manager de mémoire ne met pas en cache des objets ayant une taille plus petite que le minimum
            spécifié dans un soucis de performances. Voir <xref
            linkend="zend.memory.memory-manager.settings.min-size" /> pour plus de détails.</para>
        </sect3>
    </sect2>
</sect1>