27.9. 応用

27.9.1. 静的プロパティとしてのインデックスの使用

Zend_Search_Lucene オブジェクトは、デストラクタ内で 変更のコミットやリソースの後始末を行います。

パラメータ MaxBufferedDocs の内容に応じて、メモリ内に追加されたドキュメントを保存したり 新しいインデックスセグメントをディスクに書き出したりします。

もし MaxBufferedDocs の制限に達していない場合は "保存されていない" ドキュメントが残ってしまい、これがオブジェクトのデストラクタで 新しいセグメントとして保存されます。 インデックスの自動最適化は、 MaxBufferedDocsMaxMergeDocs および MergeFactor の設定内容により、必要に応じて行われます。

静的オブジェクトプロパティ (以下を参照ください) は、 "スクリプトが最後まで実行された" 後で 破棄されます。

<?php
class Searcher {
    private static $_index;

    public static function initIndex() {
        self::$_index = Zend_Search_Lucene::open('path/to/index');
    }
}

Searcher::initIndex();

にもかかわらず、静的プロパティのオブジェクトのデストラクタは正常に起動し、 やるべきことをすべて行う可能性があります。

問題が起こる可能性があるとすれば、例外処理です。 静的オブジェクトのデストラクタでスローされた例外は、コンテキストを保持していません。 というのも、"スクリプトが最後まで実行された後" に実行されるものだからです。

おそらく、そのような場合は例外ではなく "Fatal error: Exception thrown without a stack frame in Unknown on line 0" のようなエラーメッセージが表示されるでしょう。

Zend_Search_Lucene は、この問題を commit() メソッドで処理できるようにしています。これは、未保存の変更内容をすべて保存し、 新しいセグメントを保存するために使用しているメモリを解放します。 コミット操作は、スクリプトの実行中にいつでも何度でも行うことができます。 Zend_Search_Lucene オブジェクトを使用して、 コミット操作の後にもドキュメントの検索や追加、削除ができます。 しかし commit() をコールすることで、 もしそれ以降ドキュメントの追加や削除が行われていないのなら Zend_Search_Lucene のデストラクタは何もせず、 例外もスローしないことが保証されます。

<?php
class Searcher {
    private static $_index;

    public static function initIndex() {
        self::$_index = Zend_Search_Lucene::open('path/to/index');
    }

    ...

    public static function commit() {
        self::$_index->commit();
    }
}

Searcher::initIndex();

...

// スクリプトの終了処理
...
Searcher::commit();
...