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.

ExpressionLanguage コンポーネントは、プレーンな PHP で式をキャッシュできるようにするための compile() メソッドをすでに提供しています。ただし、内部的には、コンポーネントは解析された式もキャッシュするため、重複した式をより迅速にコンパイル/評価できます。

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.

evaluate() と compile() の両方が戻り値を提供する前に、いくつかのことを行う必要があります。 evaluate() の場合、このオーバーヘッドはさらに大きくなります。

Both methods need to tokenize and parse the expression. This is done by the parse() method. It returns a 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.

どちらの方法でも、式をトークン化して解析する必要があります。これは parse() メソッドによって行われます。これは、ParsedExpression を返します。ここで、compile() メソッドは、このオブジェクトの文字列変換を返すだけです。

To save time, the ExpressionLanguage caches the ParsedExpression so it can skip the tokenization and parsing steps with duplicate expressions. The caching is done by a PSR-6 CacheItemPoolInterface instance (by default, it uses an ArrayAdapter). You can customize this by creating a custom cache pool or using one of the available ones and injecting this using the constructor:

時間を節約するために、ExpressionLanguage は ParsedExpression をキャッシュするため、トークン化と重複した式を使用した解析の手順をスキップできます。キャッシュは、PSR-6 CacheItemPoolInterface インスタンスによって行われます (デフォルトでは、ArrayAdapter を使用します)。カスタム キャッシュ プールを作成するか、利用可能なキャッシュ プールの 1 つを使用し、コンストラクターを使用してこれを注入することで、これをカスタマイズできます。
1
2
3
4
5
use Symfony\Component\Cache\Adapter\RedisAdapter;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;

$cache = new RedisAdapter(...);
$expressionLanguage = new ExpressionLanguage($cache);

See also

こちらもご覧ください

See the The Cache Component documentation for more information about available cache adapters.

利用可能なキャッシュ アダプタの詳細については、キャッシュ コンポーネントのドキュメントを参照してください。

Using Parsed and Serialized Expressions

Both evaluate() and compile() can handle ParsedExpression and SerializedParsedExpression:

evaluate() と compile() の両方で、ParsedExpression とSerializedParsedExpression を処理できます。
1
2
3
4
5
6
// ...

// the parse() method returns a ParsedExpression
$expression = $expressionLanguage->parse('1 + 4', []);

var_dump($expressionLanguage->evaluate($expression)); // prints 5
1
2
3
4
5
6
7
8
9
use Symfony\Component\ExpressionLanguage\SerializedParsedExpression;
// ...

$expression = new SerializedParsedExpression(
    '1 + 4',
    serialize($expressionLanguage->parse('1 + 4', [])->getNodes())
);

var_dump($expressionLanguage->evaluate($expression)); // prints 5