Cache di espressioni analizzate

Il componente ExpressionLanguage fornisce già un metodo compile(), per consentire di mettere in cache le espressioni in puro PHP. Ma, internamente, il componente già mette in cache le espressioni analizzate, quindi le espressioni duplicate possono essere compilate e valutate più rapidamente.

Il flusso di lavoro

I metodi evaluate() e compile() necessitano entrambi di fare alcune cose, prima di poter restituire valori. Per evaluate(), questo overhead è più grande.

Entrambi i metodi necessitano di spezzettare e analizzare l’espressione. Lo fanno tramite il metodo parse(). Questo metodo restituisce una Symfony\Component\ExpressionLanguage\ParsedExpression. Ora, il metodo compile() restituisce semplicemente la conversione in stringa di tale oggetto. Il metodo evaluate() deve ciclare tra i “nodi” (i pezzi di un’esoressione salvata in ParsedExpression) e valutarli al volo.

Per risparmiare tempo, ExpressionLanguage mette in cache ParsedExpression, in modo da saltare i passi di spezzettamento e analisi con espressioni duplicate. La cache è eseguita da un’istanza di Symfony\Component\ExpressionLanguage\ParserCache\ParserCacheInterface (che usa un Symfony\Component\ExpressionLanguage\ParserCache\ArrayParserCache). Si può personalizzare il comportamento, creando una ParserCache personalizzata e iniettandola nell’oggetto, tramite costruttore:

use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
use Acme\ExpressionLanguage\ParserCache\MyDatabaseParserCache;

$cache = new MyDatabaseParserCache(...);
$language = new ExpressionLanguage($cache);

Nota

DoctrineBridge fornisce un’implementazione di ParserCache, che usa la libreria di cache di Doctrine, che fornisce cache per ogni sorta di strategia, come APC,filesystem e Memcached.

Uso di espressioni analizzate e serializzate

Sia evaluate() sia compile() possono gestire ParsedExpression e SerializedParsedExpression:

// ...

// il metodo parse() restituisce una ParsedExpression
$expression = $language->parse('1 + 4', array());

echo $language->evaluate($expression); // mostra 5
use Symfony\Component\ExpressionLanguage\SerializedParsedExpression;
// ...

$expression = new SerializedParsedExpression(
    serialize($language->parse('1 + 4', array()))
);

echo $language->evaluate($expression); // mostra 5

Tabella dei contenuti

Argomento precedente

Estendere ExpressionLanguage

Argomento successivo

Filesystem

Questa pagina