gpt4 book ai didi

php - 使用 Guzzle 将 csv 数据作为分块请求发送

转载 作者:可可西里 更新时间:2023-10-31 23:28:40 25 4
gpt4 key购买 nike

我想将 CSV 数据上传到 REST API(仅在特定时间点除外 CSV 数据)。

CSV 数据的来源是用户上传的。上传格式可以是CVS、ODS或XLSX电子表格数据。

当用户上传 CSV 文件时 - 我只是这样做(简化):

$handle = \fopen($tempFile, 'r');
$client->post('/import', ['body' => $handle]);

这很有效,而且很容易做到。但是,例如,当用户上传 XLSX 时,我目前循环遍历第一张工作表中的行并使用 fputcsv 创建资源。

use Box\Spout\Reader\ReaderFactory;

$reader = ReaderFactory::create('xlsx');
$reader->open($tempFile);
$handle = \fopen('php://temp', 'r+');
/** @var $reader \Box\Spout\Reader\XLSX\Reader */
foreach ($reader->getSheetIterator() as $sheet) {
/** @var $sheet \Box\Spout\Reader\XLSX\Sheet */
foreach ($sheet->getRowIterator() as $row) {
\fputcsv($handle, $row);
}
break;
}
$reader->close();
$client->post('/import', ['body' => $handle]);

我正在寻找一种方法来优化有关内存消耗和性能的过程(XLSX 导入)。

是否可以使用 guzzle 从 foreach ($sheet->getRowIterator() as $row) 中发送请求作为分块请求,而无需先使用 fputcsv 创建完整的资源?我希望这是有道理的。也许这甚至不是优化...

最佳答案

根据 GuzzleHttp 文档,该库使用 php 流:

http://docs.guzzlephp.org/en/latest/psr7.html#body

因此您可以为您的请求创建一个流,然后使用 PSR7\StreamIntefrace 类中定义的 write 方法逐行将内容写入其中:

https://github.com/php-fig/http-message/blob/master/src/StreamInterface.php#L115

顺便说一句,正如您在 Guzzle 文档中所读到的那样,流本身使用 php://temp 就像您已经在做的那样,只有优化,如果流大于 2MB,它将交换到磁盘保存超出内存。

关于php - 使用 Guzzle 将 csv 数据作为分块请求发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37158536/

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