【问题标题】:Doctrine query fails when returning more than 13578 records返回超过 13578 条记录时,Doctrine 查询失败
【发布时间】:2017-03-22 23:22:26
【问题描述】:

我有一个 symfony 2.8 应用程序,它使用学说查询来生成分页列表以显示申请人表中的所有记录。直到最近都很好用。

现在,当我导航到该页面时,我在 IE 和 Chrome 中收到错误消息,或者在 Firefox 中收到空白屏幕。

HTTP 标头显示 500 错误,但我的 symfony 日志或 PHP 错误日志中没有任何内容(错误日志在 php.ini 中打开)

我认为存在代码问题,因此花了几个小时尝试调试该问题。

在插入大量 try/catch、echo、debug、print_r 和 var_dump 语句以及针对数据库测试可运行查询、查看实际数据、设置限制和查询部分集之后,我确信 仅当我尝试在我的应用程序中返回超过 13578 条记录时才会出现问题。

这是我的查询构建器语句:

$query = $this->getEntityManager()->createQueryBuilder();
$query->select("a")
    ->from("ApplicationBundle:Applicant", "a")
    ->where("a.id > 0 ");

return $query->getQuery()->getResult();

我可以返回实际的 SQL,对数据库运行它并获取所有内容,但我没有得到 getResult() 调用返回的任何内容。甚至没有错误!

如果我将其更改为:

$query = $this->getEntityManager()->createQueryBuilder();
$query->select("a")
    ->from("ApplicationBundle:Applicant", "a")
    ->where("a.id < 13579 ");

return $query->getQuery()->getResult();

为了降低表中数据损坏的可能性,我测试了以下内容,它也有效:

$query = $this->getEntityManager()->createQueryBuilder();
$query->select("a")
    ->from("ApplicationBundle:Applicant", "a")
    ->where("a.id > 13578 ");

return $query->getQuery()->getResult();

我已经搜索了有关结果集最大大小的任何限制的文档,但没有找到任何东西。有谁知道这是否是由学说/symfony 设置的限制,或者有没有人遇到过类似的问题并设法克服它?

编辑

  1. 我正在使用 KNPPaginatorBundle 对记录进行分页
  2. php.ini 最大内存已经翻倍

【问题讨论】:

  • 检查错误日志我押注内存不足
  • 你看过 KnpPaginatorBundle 了吗? 13579 个结果需要处理很多。
  • 为什么要一次提取 13579 个结果?查看yield。 php.net/manual/en/language.generators.syntax.php
  • 忘了说我已经把脚本可以使用的最大内存翻了一番,达到了 256M。
  • 我已经在使用 KNP 分页器对结果集进行分页

标签: php mysql symfony doctrine-orm


【解决方案1】:

根据 nogad 的建议,这与内存有关。

我编辑了我的 php.ini 文件并增加了可用的最大内存,但是当我检查 IIS PHP 管理器设置时,旧值仍然存在。我增加了它以匹配 php.ini 中的设置,并且该站点再次运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 2017-12-23
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多