Кеширование выражений с использованием анализатора кешей

Компонент ExpressionLanguage уже предоставляет метод compile() для возможности кеширования выражений в чистый PHP. Но внутренне компонент также кеширует проанализированные выражения, поэтому дублированные выражения могут быть скомпилрованы или оценены быстрее.

Рабочий процесс

И evaluate(), и compile() должны сделать некоторые вещи перед тем, как каждый из них сможет предоставить возвратные значения. Для evaluate() нагрузка даже больше.

Обоим методам необходимо токенизировать и проанализировать выражение. Это делает метод parse(). Он возвращает ParsedExpression. Теперь, метод compile() просто возвращает строковое преобразование этого объекта. Методу evaluate() необходимо перебрать "узлы" (части выражения, сохранённые в ParsedExpression) и оценить их по ходу дела.

Чтобы сэкономить время, ExpressionLanguage кеширует ParsedExpression, поэтому он может опустить шаги токенизации и анализа в дублированных выражениях. Кеширование проводится экземпляром PSR-6 CacheItemPoolInterface (по умолчанию он использует ArrayAdapter). Вы можете настроить это, создав пользовательский пул кеша или используя один из доступных, и внедрив это используя конструктор:

1
2
3
4
5
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
use Symfony\Component\Cache\Adapter\RedisAdapter;

$cache = new RedisAdapter(...);
$expressionLanguage = new ExpressionLanguage($cache);
См. документацию The Cache Component, чтобы узнать больше о доступных адаптерах кеша.

Использование проанализированных и сериализованных выражений

Как evaluate(), так и compile() могут обработать ParsedExpression и SerializedParsedExpression:

1
2
3
4
5
6
// ...

// метод parse() возвращает ParsedExpression
$expression = $expressionLanguage->parse('1 + 4', array());

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', array())->getNodes())
);

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

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.