Кеширование выражений с использованием анализатора кешей
Кеширование выражений с использованием анализатора кешей
Компонент 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);
See also
См. документацию Компонент Кеш, чтобы узнать больше о доступных адаптерах кеша.
Использование проанализированных и сериализованных выражений
Как 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