1

我从在托管主机上运行 centOS 的旧服务器转移到在 AWS 中运行 Ubuntu 的新服务器。

发布动作我注意到加载项目列表的页面现在需要大约 10-12 秒来呈现(有时甚至长达 74 秒)。在旧服务器上从未注意到这一点。我使用 newrelic 来查看花费了这么长时间的原因,发现 sfPHPView->render() 占用了 99% 的时间。从 nerelic 大约有 500 次调用 DB 来呈现页面。

该页面是一个想法列表,每个想法一行。我使用 Doctrine 1.2 的 $idea->getAccounts()->getSlug() 能力。帐户是另一个表,该表与作为外来关系的想法相关联。对每个创意行调用多次。部分当前不用于保存每个行元素的代码。

  1. 对行元素使用部分是否有性能优势?(暂时忽略代码可维护性的好处)
  2. 引用通过外部关系连接的数据的最佳做法是什么?我很惊讶每次调用 $idea->getAccounts()->getSlug() 都会调用数据库。
  3. 在 ubuntu 中是否有任何明显的东西会使 sfPHPView->render() 运行速度比 centOS 慢?
4

2 回答 2

2

我会给你我的想法

  • 当对行元素使用局部时,将其放入缓存中更容易,因为您可以通过局部仿射缓存。

  • 因为您在进行查询时没有明确定义关系,所以 Doctrine 不会将所有元素与关系结合起来。对于这一点,您可以手动定义要水合的关系。然后,您的呼叫$idea->getAccounts()->getSlug()不会每次都执行新查询。

$q = $this->createQuery();
$q->leftJoin('Idea.Account');
  • 不知道第3点。

PS:对于第 2 点,当您想要显示关系中的信息(在列表视图中)时,在管理 gen 中有很多查询是很常见的。解决方案是定义检索数据的方法:

在您的 generator.yml 中:

list:
  table_method: retrieveForBackendList

在 IdeaTable 中:

public function retrieveForBackendList(Doctrine_Query $q)
{
  $rootAlias = $q->getRootAlias();
  $q->leftJoin($rootAlias . '.Account');

  return $q;
}
于 2012-05-14T07:28:58.520 回答
0

尽管除了 jOk 的建议之外,我还会添加我为提高页面加载速度所做的其他事情。

除了显式连接之外,我还执行了以下操作:

  1. 切换到返回一个 DQL 查询对象,然后将其传递给 Doctrine 的paginator
  2. 从使用更改include_partial()为 PHP 的include(),这减少了对象创建时间include_partial()
  3. 将数据库中的数据水化为数组而不是对象
  4. 通过在数据库中执行更多 leftJoins 删除了一些 foreach 循环
  5. 使用结果和查询缓存来减少数据库调用的数量
  6. 使用视图缓存来减少 PHP 模板生成时间

有趣的是,通过执行 1 到 4,它使 5 和 6 更有效且更易于实施。我认为在使用缓存之前改进你的代码有一些话要说。

于 2013-03-04T10:55:28.130 回答