七月
14
2016

使用解析缓存器缓存表达式

表达式语言(ExpressionLanguage)组件已经提供了一个 compile() 方法来允许缓存原生 PHP。事实上,该组件也可以缓存解析过的表达式,因此,重复的表达式可以更快地被编译和执行。

工作流程

在提供返回值之前,evaluate()compile() 两个方法需要额外做一些工作。对于 evaluate() 方法,这些开销会更大。

两个方法均需要标记和解析表达式。这些工作都可以通过 parse() 方法来完成。它将返回一个 ParsedExpression 对象。目前,compile() 方法只是返回一个该对象转化而成的字符串。evaluate() 方法则还需要循环地动态执行 “节点(nodes)”(保存在 ParsedExpression 中的表达式片段)。

在保存阶段,表达式语言(ExpressionLanguage)将缓存解析后表达式(ParsedExpression),因此重复的表达式将跳过标记(tokenize)和解析(parse)步骤。缓存功能将被解析缓存器接口(ParserCacheInterface)的实例完成(默认情况下,会使用数组解析缓存器(ArrayParserCache))。你可以通过创建自定义的解析缓存器(ParserCache)然后注入到对象的构造方法中来实现缓存功能。

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

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

DoctrineBridge 提供了一个使用 doctrine cache library 的解析缓存器的实现,该实现为所有分类的缓存策略提供了缓存功能,例如:ApcFilesystemMemcached

使用解析和序列化过后的表达式

evaluate()compile() 方法均可以操作 ParsedExpressionSerializedParsedExpression

// ...

// parse() 方法返回 ParsedExpression
$expression = $language->parse('1 + 4', array());

var_dump($language->evaluate($expression)); // 输出 5
use Symfony\Component\ExpressionLanguage\SerializedParsedExpression;
// ...

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

var_dump($language->evaluate($expression)); // 输出 5

原文地址:Caching Expressions Using Parser Caches

非特殊注明博文为 爱PHP吧(www.iphp8.com)原创内容,转载请注明原文地址:http://www.iphp8.com/?post=96

评论

发表评论:

(选填)

(选填)