27.9. Utilisation avancée

27.9.1. Utiliser l'index en tant que propriété statique

L'objet Zend_Search_Lucene utilise un destructeur d'objet pour valider les changements et vider les ressources.

Il stocke les documents ajoutés dans la mémoire et décharge le nouveau segment d'index sur le disque selon le paramètre MaxBufferedDocs.

Si la limite MaxBufferedDocs n'est pas atteinte alors il y a quelques documents "unsaved" (non-sauvegardé) qui sont sauvegardés en tant que nouveau segment dans le destructeur d'objet. Le procédé d'auto-optimisation de l'index est appelé si besoin selon des paramètres de MaxBufferedDocs, MaxMergeDocs et MergeFactor parameters.

Les propriétés statiques de l'objet (voir ci-dessous) sont détruites après la "dernière ligne du script exécuté".

<?php
class Searcher {
    private static $_index;

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

Searcher::initIndex();
?>

Néanmoins, le destructeur d'objet pour les propriétés statiques est correctement appelé et a la possibilité de faire tout ce qu'il doit faire.

Le problème potentiel est le traitement d'exceptions. Les exceptions levées par les destructeurs d'objets statiques n'ont pas de contexte, parce que l'exécution est réalisée "après la fin de script".

Vous obtiendrez le message d'erreur "Fatal error: Exception thrown without a stack frame in Unknown on line 0" au lieu de la description d'exception pour de tels cas.

Zend_Search_Lucene donne la possibilité d'apréhender ce problème avec la méthode commit(). Elle sauve tous les changements non-sauvegardés et libère la mémoire utilisée pour stocker de nouveaux segments. Vous êtes libre d'employer la méthode commit() n'importe quand ou plusieurs fois pendant l'exécution de script. Vous pouvez encore employer l'objet Zend_Search_Lucene pour rechercher, ajouter ou supprimer un document après l'opération commit(). Mais commit() donne la garantie, que s'il n'y a aucun document s'ajoutant ou supprimant après que l'appel commit(), alors le destructeur de Zend_Search_Lucene n'a rien à faire et ne lève aucune exception :

<?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();

...

// Script shutdown routine
...
Searcher::commit();
...
?>