【问题标题】:Symfony/doctrine consuming to much memory, out of memory errorSymfony/doctrine 消耗大量内存,内存不足错误
【发布时间】:2019-11-13 03:16:23
【问题描述】:

我想从表中获取数据并将其编码为 json。我正在使用学说和查询构建器来选择我想要的数据(基本上是表中的所有内容)。问题是在 dev 中,一切正常,但是当我去 prod 时,我得到了错误:PHP 致命错误:内存不足 ...

我正在检索的数据最多为 300KB。 在这种情况下,我使用路由来检索 project (600B) 的列表,它是最小的表之一。 此表有两个 OneToMany 关联。

我正在检索的数据如下所示:

[
  {
   id: "bar",
   name: "bar",
   description: "bar",
   project_date_start: "2022-01-01 00:00:00",
   project_date_end: "2019-05-21 12:19:27"
  },
  {
   id: "foo",
   name: "foo",
   description: "foo",
   project_date_start: "2021-02-02 00:00:00",
   project_date_end: "2022-02-02 00:00:00"
  }
]

学说的查询构建器和功能:

    public function findAllProject()
    {
        return $this->createQueryBuilder('p')
            ->select('p.id', 'p.name', 'p.description', 'p.project_date_start', 'p.project_date_end')
            ->getQuery()
            ->getResult()
        ;
    }
        public function project(Request $request)
        { 
            $em = $this->getDoctrine()->getEntityManager();

            $projectRepo = $this->getDoctrine()->getRepository(Project::class);

            $project = $projectRepo->findAllProject();

            $data = $this->get('jms_serializer')->serialize($project, 'json');

            $response = new Response($data);
            $response->headers->set('Content-Type', 'application/json');
            $response->headers->set('Access-Control-Allow-Origin', '*');

            return $response;
        }

我试过了:
- 在服务器上重新安装 Apache
- 更改 php.ini 中 memory_limit 的值
- 不使用 jms_serializer 而是使用 json_encode

编辑

所以错误肯定不是来自序列化程序,因为在我从存储库获取数据时抛出了错误 (findAllProject())。

我已经设法通过减少我正在检索的数据来使其工作,但这不是一个解决方案,因为我需要所有数据并且正如我所说 project 是最小的表之一,那么当我需要检索更大的数据时呢?

如果我从 symfony 取回数据,可能不是 symfony 而是 apache,什么会导致这个错误?

另外,从 queryBuilder 生成的 SQL 是好的(只是一个普通的选择)

结束编辑

我认为这不是 json 编码部分的问题,也不是 apache 服务器配置问题(内存限制为 -1)。

我认为 project 表的关联正在搞砸一切,而学说正试图遍历所有数据库。也许我的数据库设计有问题?
例如,表 typeproject 大小相同,但没有内存不足错误。

我不知道我还能尝试什么,有什么想法吗?

【问题讨论】:

  • 看起来你只是在处理一个实体,而不是它的任何关联,所以首先删除 select 并使用 getResult(Query::HYDRATE_ARRAY/HYDRATE_SIMPLEOBJECT) 。更重要的是,您正在从数据库获取的所有内容(所有项目)上运行序列化程序,这更像是一种“等待发生的灾难”类型的实践——不要那样做!
  • 我尝试使用getResult(Query::HYDRATE_ARRAY/HYDRATE_SIMPLEOBJECT),但无法成功,您有链接说明如何使用它吗?我对 symfony/学说很陌生。那么处理序列化的最佳方法是什么?因为“项目”数组很小,而且对象本身很简单,我不明白这对 jms_serialiser 来说是个问题。谢谢
  • 只是出于好奇:您是否尝试过将开发机器上的环境设置为“prod”,如果可行,请检查php.net/memory_get_usage 以查看正在使用多少内存。我的意思是,也许您的服务器实际上内存太少。如果它实际上不是这么大的内存:我从另一个人那里读过一次,在 php 可执行文件中有一个位翻转,并且每当他序列化东西时都会导致内存不足。 sooo ...您可以尝试重新安装php ...
  • if 内存不足出现在序列化程序行:尝试(出于测试目的)其他序列化,例如调用 json_encode、print_r、var_dump、var_export、...
  • 我已经在本地机器上测试了 prod 配置,它工作正常。正如我在帖子中所说,我已经尝试过不同的序列化方式,我认为这不是序列化问题,因为我在获取数据时遇到了错误。

标签: php apache symfony doctrine


【解决方案1】:

所以,我从头开始重新安装了我的服务器,然后我的项目并且它工作了,所以我不知道是什么导致了这个问题。

【讨论】:

    猜你喜欢
    • 2015-07-25
    • 2017-09-10
    • 2022-01-16
    • 2014-01-04
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    相关资源
    最近更新 更多