gpt4 book ai didi

PHP 使用 fputcsv 到 php ://output 时减少内存使用

转载 作者:搜寻专家 更新时间:2023-10-31 21:14:52 24 4
gpt4 key购买 nike

我们遇到了一些奇怪的问题。它是这样的。我们有大量数据需要输出给客户端。这些数据文件不能预先构建,它们必须由实时数据提供。

我的首选解决方案是像这样从提取中逐行写入 CSV:

 while($datum = $data->fetch(PDO::FETCH_ASSOC)) {
$size += fputcsv($outstream, $datum, chr(9), chr(0));
}

这解决了很多荒谬的内存使用问题(一次将 100000 条记录读入内存是一种糟糕的做法),但我们仍然存在大型表的挥之不去的问题,随着数据大小的增加,这些问题只会变得更糟。请注意,没有数据分区;他们不按年分段下载,但他们下载所有数据,然后自己分段。这是根据要求;我无法对此进行尽可能多的更改,因为它可以完全解决问题。

在任何一种情况下,它都会在最大的表上耗尽内存。一种解决方案是增加可用内存,这解决了一个问题,但如果有多个客户端正在下载,则建议稍后甚至现在创建服务器负载问题。

在这种情况下,$outstream 是:

$outstream = fopen("php://output",'w');

这看起来很明显不是真正的物理磁盘位置。我不太了解 php://output 就数据在发送到客户端之前所在的位置而言,但很明显,通过这种方法将流形数据库表简单地写入 csv 存在内存问题。

确切地说,暂存框允许 PHP 使用大约 128mb,而这个调用尤其短了大约 40mb(它试图再分配 40mb。)这看起来有点奇怪,因为您会期望它要求内存分成更小的部分。

有人知道如何处理这个问题吗?

最佳答案

所以看起来内存消耗是由 Zend Framework 的输出缓冲引起的。我想出的最佳解决方案是这个。

在我们开始将文件流式传输到客户端之前执行 ob_end_clean()。 ZF 的这个特定实例不会产生任何正常输出,也不会在此之后执行任何操作,因此不会出现复杂情况。奇怪的事情发生了(也许从用户的角度来看)是他们真的得到了流式传输给他们的文件。

代码如下:

ob_end_clean();
while($datum = $data->fetch(PDO::FETCH_ASSOC)) {
$size += fputcsv($outstream, $datum, chr(9), chr(0));
}

内存使用量(根据某处 ZF 论坛帖子中建议的函数 memory_get_peak_usage(true))从 90 兆字节下降到 9 兆字节,这是我的开发箱在读取任何文件之前使用的内存。

谢谢大家的帮助!

关于PHP 使用 fputcsv 到 php ://output 时减少内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11215129/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com