Caching Expressions Using Parser Caches
Caching Expressions Using Parser Caches¶
The ExpressionLanguage component already provides a
compile()
method to be able to cache the expressions in plain PHP. But internally, the
component also caches the parsed expressions, so duplicated expressions can be
compiled/evaluated quicker.
The Workflow¶
Both evaluate()
and compile()
need to do some things before each can provide the return
values. For evaluate()
, this overhead is even bigger.
Both methods need to tokenize and parse the expression. This is done by the
parse()
method. It returns a Symfony\Component\ExpressionLanguage\ParsedExpression
.
Now, the compile()
method just returns the string conversion of this object.
The evaluate()
method needs to loop through the “nodes” (pieces of an
expression saved in the ParsedExpression
) and evaluate them on the fly.
To save time, the ExpressionLanguage
caches the ParsedExpression
so
it can skip the tokenize and parse steps with duplicate expressions.
The caching is done by a
Symfony\Component\ExpressionLanguage\ParserCache\ParserCacheInterface
instance (by default, it uses an
Symfony\Component\ExpressionLanguage\ParserCache\ArrayParserCache
).
You can customize this by creating a custom ParserCache
and injecting this
in the object using the constructor:
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
use Acme\ExpressionLanguage\ParserCache\MyDatabaseParserCache;
$cache = new MyDatabaseParserCache(...);
$language = new ExpressionLanguage($cache);
Note
The DoctrineBridge provides a Parser Cache implementation using the doctrine cache library, which gives you caching for all sorts of cache strategies, like Apc, Filesystem and Memcached.
Using Parsed and Serialized Expressions¶
Both evaluate()
and compile()
can handle ParsedExpression
and
SerializedParsedExpression
:
use Symfony\Component\ExpressionLanguage\ParsedExpression;
// ...
$expression = new ParsedExpression($language->parse('1 + 4'));
echo $language->evaluate($expression); // prints 5
1 2 3 4 5 6 7 8 | use Symfony\Component\ExpressionLanguage\SerializedParsedExpression;
// ...
$expression = new SerializedParsedExpression(
serialize($language->parse('1 + 4'))
);
echo $language->evaluate($expression); // prints 5
|
This work, including the code samples, is licensed under a Creative Commons BY-SA 3.0 license.