2016-05-11 5 views
4

CSVデータをREST APIにアップロードしたい(特定のenpointのCSVデータのみを除いて)。Guzzでチャンク付きのCSVデータを送信

CSVデータのソースは、ユーザーによるアップロードです。アップロードされた形式は、CVS、ODS、またはXLSXのスプレッドシートデータのいずれかです。

ユーザーがCSVファイルをアップロード - 私は(簡体字)ん:

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

これは動作し、TODOが容易です。しかし、ユーザーが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インポート)を最適化する方法を探しています。

最初にfputcsvで完全なリソースを作成しなくても、グーグルがチャンクリクエストとしてforeach ($sheet->getRowIterator() as $row)内からリクエストを送信することは可能ですか?私はこれが理にかなってほしい。多分これさえGuzzleHttpドキュメントにしたがって

+0

これはGuzzle 6の場合ですか? – DaSourcerer

+0

はい - Guzzle 6! – madflow

答えて

2

...最適ではないでしょう、ライブラリはPHPのストリームを使用しています。

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

だからあなたはあなたの要求のためのストリームを作成し、内容を書き込むことができますあなたは私を読むことができるよう、

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

ところで:ラインそれPSR7 \ StreamIntefraceクラスからwriteメソッドを使用して線によってで定義されていますGuzzleのドキュメントでは、ストリーム自体がphp://tempを使用しています。ストリームが2MBより大きい場合は、メモリを超えてディスクにスワップする最適化のみを使用します。

関連する問題