<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<!-- EN-Revision: 15215 -->
<sect1 id="zend.memory.overview">
    <title>概要</title>

    <sect2 id="zend.memory.introduction">
        <title>導入</title>
        <para>
            <classname>Zend_Memory</classname> コンポーネントは、
            限られたメモリ環境でデータを管理するためのものです。
        </para>

        <para>
            メモリマネージャが要求に応じて
            メモリオブジェクト (メモリコンテナ)
            を作成し、必要に応じて透過的にスワップ/読み込みを行います。
        </para>

        <para>
            たとえば、あるオブジェクトを作成あるいは読み込むことによって
            メモリの使用量が制限値を超えてしまう場合に、
            管理しているオブジェクトのいくつかをメモリの外部の
            キャッシュにコピーします。
            このようにして、管理しているオブジェクトのメモリ使用量が
            制限値を超えないようにします。
        </para>

        <para>
            メモリマネージャの保存機能は、
            <link linkend="zend.cache.backends">Zend_Cache バックエンド</link>
            を使用しています。
        </para>

        <example id="zend.memory.introduction.example-1">
            <title>Zend_Memory コンポーネントの使用法</title>
            <para>
                <classname>Zend_Memory::factory()</classname> は、
                指定したバックエンドオプションでメモリマネージャオブジェクトの
                インスタンスを作成します。
            </para>
                <programlisting role="php"><![CDATA[
$backendOptions = array(
    'cache_dir' => './tmp/' // スワップしたメモリブロックを配置するディレクトリ
);

$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>動作原理</title>

        <para>
            <classname>Zend_Memory</classname> コンポーネントは、以下の概念で構成されています。
            <itemizedlist>
                <listitem>
                    <para>メモリマネージャ</para>
                </listitem>
                <listitem>
                    <para>メモリコンテナ</para>
                </listitem>
                <listitem>
                    <para>ロックされたメモリオブジェクト</para>
                </listitem>
                <listitem>
                    <para>移動可能なメモリオブジェクト</para>
                </listitem>
            </itemizedlist>
        </para>

        <sect3 id="zend.memory.theory-of-operation.manager">

            <title>メモリマネージャr</title>

            <para>
                メモリマネージャは、アプリケーションからの要求に応じて
                (ロックされた、あるいは移動可能な) メモリオブジェクトを作成し、
                それをメモリコンテナオブジェクトにラッピングしたものを返します。
            </para>

        </sect3>

        <sect3 id="zend.memory.theory-of-operation.container">

            <title>メモリコンテナ</title>

            <para>
                メモリコンテナは、文字列型の属性 <code>value</code> を
                (仮想的に、あるいは実際に) 保持します。
                この属性には、メモリオブジェクトの作成時に指定された値が含まれます。
            </para>

            <para>
                この属性 <code>value</code> は、オブジェクトのプロパティとして扱うことができます。

                <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>
                    5.2 より前のバージョンの PHP を使用している場合は、
                    value プロパティに直接アクセスするのではなく
                    <link linkend="zend.memory.memory-objects.api.getRef">getRef()</link>
                    メソッドを使用します。
                </para>
            </note>

        </sect3>

        <sect3 id="zend.memory.theory-of-operation.locked">

            <title>ロックされたメモリ</title>

            <para>
                ロックされたメモリオブジェクトは、常にメモリ内に保持されます。
                ロックされたメモリに保存されたデータは、
                決してキャッシュにスワップされることはありません。
            </para>

        </sect3>

        <sect3 id="zend.memory.theory-of-operation.movable">

            <title>移動可能なメモリ</title>

            <para>
                移動可能なメモリオブジェクトは、
                必要に応じて <classname>Zend_Memory</classname> がキャッシュにスワップしたり
                キャッシュから読み戻したりします。この処理は透過的に行われます。
            </para>

            <para>
                メモリマネージャは、指定した最小値より小さいサイズのオブジェクトはスワップしません。
                これは、パフォーマンスを考慮した判断です。詳細は
                <xref linkend="zend.memory.memory-manager.settings.min-size" />
                を参照ください。
            </para>

        </sect3>

    </sect2>

</sect1>
