【发布时间】: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 表的关联正在搞砸一切,而学说正试图遍历所有数据库。也许我的数据库设计有问题?
例如,表 type 与 project 大小相同,但没有内存不足错误。
我不知道我还能尝试什么,有什么想法吗?
【问题讨论】:
-
看起来你只是在处理一个实体,而不是它的任何关联,所以首先删除
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