<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<!-- EN-Revision: 24249 -->
<sect1 id="zend.memory.memory-manager">
    <title>メモリマネージャ</title>

    <sect2 id="zend.memory.memory-manager.creation">
        <title>メモリマネージャの作成</title>

        <para>
            新しいメモリマネージャ
            (<classname>Zend_Memory_Manager</classname> オブジェクト) を作成するには、
            <methodname>Zend_Memory::factory($backendName [, $backendOprions])</methodname>
            メソッドを使用します。
        </para>

        <para>
            最初の引数 <code>$backendName</code> は文字列で、
            <classname>Zend_Cache</classname> がサポートするバックエンド実装のいずれかの名前を指定します。
        </para>

        <para>
            二番目の引数 <code>$backendOptions</code> は省略可能で、
            バックエンドに渡すオプションの配列を指定します。
        </para>

        <programlisting language="php"><![CDATA[
$backendOptions = array(
    'cache_dir' => './tmp/' // スワップしたメモリブロックを配置するディレクトリ
);

$memoryManager = Zend_Memory::factory('File', $backendOptions);
]]></programlisting>

        <para>
            <classname>Zend_Memory</classname> は <link linkend="zend.cache.backends">Zend_Cache のバックエンド</link>
            を使用してデータを保存します。
        </para>

        <para>
            標準の <classname>Zend_Cache</classname> のバックエンドに加え、特別な名前
            'None' をバックエンド名として使用することもできます。
        </para>

        <programlisting language="php"><![CDATA[
$memoryManager = Zend_Memory::factory('None');
]]></programlisting>

        <para>
            バックエンド名に 'None' を使用すると、
            メモリマネージャは決してメモリブロックをスワップしなくなります。
            メモリの制限がない場合、あるいはオブジェクトのサイズが
            決してメモリの制限に達しない場合などに有用です。
        </para>

        <para>
            'None' バックエンドには何もオプションを指定する必要がありません。
        </para>

    </sect2>

    <sect2 id="zend.memory.memory-manager.objects-management">
        <title>メモリオブジェクトの管理</title>

        <para>
            この節では、管理しているメモリ内でのオブジェクトの作成や破棄の方法、
            そしてメモリマネージャの挙動を設定する方法を説明します。
        </para>

        <sect3 id="zend.memory.memory-manager.objects-management.movable">
            <title>移動可能なオブジェクトの作成</title>

            <para>
                移動可能なオブジェクト (スワップされる可能性のあるオブジェクト)
                を作成するには、<methodname>Zend_Memory_Manager::create([$data])</methodname>
                メソッドを使用します。
            </para>

            <programlisting language="php"><![CDATA[
$memObject = $memoryManager->create($data);
]]></programlisting>

            <para>
                引数 <code>$data</code> は省略可能で、
                オブジェクトの値を初期化するために使用します。
                引数 <code>$data</code> を省略した場合は、値は空の文字列となります。
            </para>

        </sect3>

        <sect3 id="zend.memory.memory-manager.objects-management.locked">
            <title>ロックされたオブジェクトの作成</title>

            <para>
                ロックされたオブジェクト (スワップされないオブジェクト)
                を作成するには、<methodname>Zend_Memory_Manager::createLocked([$data])</methodname>
                メソッドを使用します。
            </para>

            <programlisting language="php"><![CDATA[
$memObject = $memoryManager->createLocked($data);
]]></programlisting>

            <para>
                引数 <code>$data</code> は省略可能で、
                オブジェクトの値を初期化するために使用します。
                引数 <code>$data</code> を省略した場合は、値は空の文字列となります。
            </para>

        </sect3>

        <sect3 id="zend.memory.memory-manager.objects-management.destruction">
            <title>オブジェクトの破棄</title>

            <para>
                メモリオブジェクトは、それがスコープの外に出た際に
                自動的に破棄され、メモリから削除されます。
            </para>

            <programlisting language="php"><![CDATA[
function foo()
{
    global $memoryManager, $memList;

    ...

    $memObject1 = $memoryManager->create($data1);
    $memObject2 = $memoryManager->create($data2);
    $memObject3 = $memoryManager->create($data3);

    ...

    $memList[] = $memObject3;

    ...

    unset($memObject2); // $memObject2 はここで破棄されます

    ...
    // $memObject1 はここで破棄されますが、
    // $memObject3 オブジェクトはまだ $memList に参照されており、
    // 破棄されていません
}
]]></programlisting>

            <para>
                これは、移動可能なオブジェクトとロックされたオブジェクトの
                どちらにもあてはまります。
            </para>

        </sect3>

    </sect2>

    <sect2 id="zend.memory.memory-manager.settings">
        <title>メモリオブジェクトの設定</title>

        <sect3 id="zend.memory.memory-manager.settings.memory-limit">
            <title>メモリの制限</title>

            <para>
                メモリの制限とは、移動可能なオブジェクトを読み込む際に
                使用できるバイト数のことです。
            </para>

            <para>
                オブジェクトを読み込んだり作成したりすることで
                この制限をこえてしまう場合は、
                メモリマネージャは他のオブジェクトのどれかをスワップします。
            </para>

            <para>
                メモリの制限を取得あるいは設定するには、
                <methodname>getMemoryLimit()</methodname> メソッドおよび <methodname>setMemoryLimit($newLimit)</methodname>
                メソッドを使用します。
            </para>

            <programlisting language="php"><![CDATA[
$oldLimit = $memoryManager->getMemoryLimit();  // メモリの制限バイト数を取得します
$memoryManager->setMemoryLimit($newLimit);     // メモリの制限バイト数を設定します
]]></programlisting>

            <para>
                メモリの制限に負の値を設定すると、'制限なし' を意味します。
            </para>

            <para>
                デフォルト値は、php.ini の 'memory_limit'
                の値の三分の二となります。もし php.ini で
                'memory_limit' が設定されていない場合は、デフォルト値は
                '制限なし' (-1) となります。
            </para>

        </sect3>

        <sect3 id="zend.memory.memory-manager.settings.min-size">
            <title>MinSize</title>

            <para>
                MinSize は、メモリマネージャがスワップの対象とするメモリオブジェクトの最小サイズです。
                メモリマネージャは、この値より小さなサイズのオブジェクトはスワップしません。
                これにより、スワップや読み込みの回数が莫大なものになることを防ぎます。
            </para>

            <para>
                最小サイズを取得あるいは設定するには、
                <methodname>getMinSize()</methodname> メソッドおよび <methodname>setMinSize($newSize)</methodname>
                メソッドを使用します。
            </para>

            <programlisting language="php"><![CDATA[
$oldMinSize = $memoryManager->getMinSize();  // MinSize をバイト数で取得します
$memoryManager->setMinSize($newSize);        // MinSize をバイト数で設定します
]]></programlisting>

            <para>
                デフォルト値は 16KB (16384 バイト) です。
            </para>

        </sect3>
    </sect2>
</sect1>
