1

.csv ファイルを書き込むときは、次のように fputcsv を使用します。

- 一時ファイルを開く $f = tmpfile();
- fputcsv($f,$csv_row) を使用してコンテンツをファイルに書き込みます。
- 添付用の適切なヘッダーを送信する
- 次のようにファイルを読み取ります。

# ポインタを先頭に戻す
巻き戻し($f);

while(!feof($f))
    echo fgets($f);

# fclose は一時ファイルを削除します !
fclose($f);

別のアプローチは次のとおりです。

- ファイルを開く $f = fopen('php://output', 'w');
- 添付用の適切なヘッダーを送信する
- fputcsv($f,$csv_row) を使用してコンテンツをファイルに書き込みます。
- $f ストリームを閉じる

私の質問は次のとおりです。データをより速く出力し、サーバーリソースを考慮に入れるための最良のアプローチは何でしょうか?

最初の方法は、より多くの書き込みを使用し、より多くのリソースを消費しますが、出力は非常に高速です。

2番目の方法では、書き込みが少なくなり、出力が遅くなると思います。

これについてのご意見をお待ちしております。

ありがとう。

4

2 に答える 2

0

fpassthru()は、低レベルで行っていることを行います。次のように使用します。

# move pointer back to beginning 
rewind($f);

while(fpassthru($f) !== false);

# fclose deletes temp file !
fclose($f);

csv ファイルであっても、出力時にファイルを生成する場合を除き、csv 関数に限定する必要はありません。

CSV をファイルではなく出力にストリーミングすると、パフォーマンスが向上する可能性があります。

于 2012-08-31T08:22:31.380 に答える
0

csv コンテンツを tmp ファイル/php の出力ストリームに書き込む必要があるのはなぜですか?

csv コンテンツを直接エコーするだけで済みます。ファイル操作は必要ありません

  • 添付用の適切なヘッダーを送信する
  • csv コンテンツをエコーし​​ます。

header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");

foreach ($csv_rows as $csv_row) {
  echo $csv_row;
}
exit;
于 2012-08-31T08:29:12.540 に答える