通过创建类的轻型和重型版本来提高性能

时间:2013-10-08 00:40:19

标签: php performance symfony

我前段时间完成了一个应用程序,我已经开始进行优化,但还有一些尚未优化的东西,比如保存过程,很多人会说这很简单你做的不需要优化它。

现在我的应用程序有一些特定的要求,所有要求都是通过JSON API公开的。这使我选择了一个像JMSSerializer这样的工具来进行对象的作业序列化。问题是我有几个密切相关的实体,因为序列化递归访问每个属性,这可能成为一个大问题,尤其是当你开始aunmentar记录时。 50K,100K或1M。 JMS序列化变得很重,应用程序响应变慢。

JMS现在提供排除策略,我目前正在使用这些组,但这又回到了地狱,我的问题是:对于一个表有两个实体(Light和Heavy)是不是很糟糕?这可能吗?

我的问题集中在实体的某些属性是通过表单编辑但大多数字段不是(主要是那些与其他实体的关系)

可能所有这些仅仅是在精神疲惫的时刻发生在我身上的愚蠢,但如果我想阅读一些关于如何避免这种情况的意见或建议而不必创建复杂的排斥规则

希望解决方案的重点和设计能够与symfony和Doctrine的组件一起使用

2 个答案:

答案 0 :(得分:0)

嗯,有(部分)你的回答:

% app/console doctrine:schema:update --dump-sql
[Doctrine\DBAL\Schema\SchemaException]
The table with name 'foo.foo' already exists.

它可能在某些情况下有效(可能如果不使用任何Schema / SchemaTool相关的东西),但在许多其他情况下它会让你陷入麻烦。

更传统的方法是将实体分成两个独立的实体,一个只有“Light”部分,另一个只有额外的“Heavy”部分,并通过一对一连接两者关系。然后在“Light”实体上使用序列化器组来控制是否将“重”部件序列化。

答案 1 :(得分:0)

我们遇到了序列化组失控的相同问题,并考虑了几个选项。我们最终创建了一个命名方案,并使用数组来尝试控制序列化组的扩散。

在我们的实体中,我们在关系之后命名序列化组。所有基本实体字段都以实体命名(可能缩写)。

* @Groups({'EntityA_EntityB'})

然后我们根据用法

在实体中创建序列化组的数组
static $lightView = array('EntityA','EntityA_EntityB', 'EntityA_EntityC');

然后在控制器中我们可以轻松获得组

private $viewGroup = array_merege(EntityA::$lightView, EntityC::$lightView);

它实际上只是标准序列化组的一个薄层,但这意味着我们不必创建这么多组,并且它们都在一个地方进行管理(没有滚动实体添加到注释)。我们所有的实体都被序列化为json并发送到客户端以在knockout.js中呈现,所以我感到很痛苦,试图管理越来越多的序列化组...