2017-08-14 42 views
0

我有一个有Blob字段的表。有时候,当加载这个数据的概览页面(显示所有数据,通常在后端SELECT *声明),我得到一个内存不足的错误 - 最新的一个如下所示(拆分多行读取):Doctrine Blob类型内存不足错误

request.Critical: Uncaught PHP Exception 
Symfony\Component\Debug\Exception\OutOfMemoryException: "Error: Allowed memory size of 
134217728 bytes exhausted)tried to allocate 1679360 bytes)" at /var/www/html/my_project/vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/BlobType.php 
line 50 ("exception":"[object] 
(Symfony\\Component\\Debug\\Exception\\OutOfMemoryException(code: 0): Error: Allowed memory 
size of 134217728 bytes exhausted (tried to allocate 1679360 bytes) at /var/www/html/my_project/vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/BlobType.php:50)") 
[] 

教义库是指该行50

48. if (is_string($value)) { 
49. $fp = fopen('php://temp', 'rb+'); 
50. fwrite($fp, $value); // Exception occurs here 
51. fseek($fp, 0); 
52. $value = $fp; 
53. } 

我该如何面对呢?我还没有在网上找到完全相同的问题。 fwrite讨论关于使用流写入数据的内存不足异常的其他问题 - 但这会与我很犹豫(不完全理解它)的Doctrine库混淆。其他解决方案建议提高php.ini的内存限制,但这不是一个临时解决方案吗?任何想法将有帮助

+0

什么是你存储为blob? – svgrafov

+0

@svgrafov这是一个PDF - 用户需要能够添加一个到每个记录(尽管一些记录没有一个,在这种情况下它是空的)。 – Kvothe

+0

@svgrafov我想实际上我应该考虑将这些移动到文件存储。目前,我有一个在EC2实例上运行的Web服务器,并且该数据库是一个Aurora RDS实例。我将添加一个S3存储桶到这个设置并从那里提供PDFs? – Kvothe

回答

0

问题是在SELECT *。我非常怀疑你需要所有的桌子。以块的形式显示数据。 分页将有所帮助。

UPD 甚至比分页更好的主意 - 将文件视为文件。这意味着将它们存储为文件。并且只保留实体中的文件名(或其他标识符)。

+0

我正在考虑这样做 - 只需要花时间切换到使用分页。但任何想法,为什么它只会偶尔发生? – Kvothe