Contributed by Kévin Dunglas and Nicolas Grekas in #27049 and #27105.

Serializer组件 在 Symfony 4.1 中变得更快,提升你的程序性能达40%。最强的一点,你毋须对代码做出任何改变来让它变快。只要在本月末更新到 Symfony 4.1。

如果你已经用过 Symfony serializer,你可能知道它是把 PHP 对象给 normalizing/denormalizing 成数组,然后对数组 encoding/decoding 成需要的格式 (JSON, XML, 等等)。

程序可以定义许多 normalizers/denormalizers,对于它们,只要新对象被 normalized/denormalized,Symfony 就必须调用 supportsNormalization() 方法。 理论上 supportsNormalization() 的结果依赖于多个因素。实践中,多数 normalizers 只依赖于类型、格式以及信息是否可以轻易被缓存。

这就是用于改善 Serializer 性能的技巧点。我们已经引入了全新的 CacheableSupportsMethodInterface 给那些 normalizers/denormalizers,它们只使用各自 supports*() 方法里的 type 和 format:

1
2
3
4
5
6
namespace Symfony\Component\Serializer\Normalizer;
 
interface CacheableSupportsMethodInterface
{
    public function hasCacheableSupportsMethod(): bool;
}

我们在所有内置的 normalizers 中实现了此接口,因此你不必改变代码。如果你创建了自己的 normalizers,查看它们是否可以通过相同的方式被缓存,以及必要时是否实现了该接口。

根据我们的基准,这种改变可以让使用了若干 normalizers 的 简单程序 最多 变快10%。使用了很多 normalizers 的 复杂程序,诸如 API Platform 这种,可以 变快40%