【问题标题】:PHP efficiently write and output csv files using fputcsvPHP 使用 fputcsv 高效地写入和输出 csv 文件
【发布时间】:2012-08-26 01:00:13
【问题描述】:

在编写 .csv 文件时,我像这样使用 fputcsv:

- 打开一个临时文件 $f = tmpfile(); - 使用 fputcsv($f,$csv_row) 将内容写入文件; - 发送适当的附件标题 - 像这样读取文件: # 将指针移回起点 倒带($f); 而(!feof($ f)) 回声 fgets($f); # fclose 删除临时文件! fclose($f);

另一种方法是:

- 打开文件 $f = fopen('php://output', 'w'); - 发送适当的附件标题 - 使用 fputcsv($f,$csv_row) 将内容写入文件; - 关闭 $f 流

我的问题是:更快地输出数据并考虑服务器资源的最佳方法是什么?

第一种方法会使用更多写入并消耗更多资源,但输出速度会非常快。

第二种方法使用更少的写入,并且我认为输出速度会更慢。

急切地等待您对此的意见。

谢谢。

【问题讨论】:

  • 这与意见无关。我们不认为其中一个更快。尝试对这两种方法进行基准测试,您就会知道哪一种更快。
  • @BerryLangerak 是的,你是对的。我将尝试对此进行基准测试并发布结果。

标签: php file fputcsv


【解决方案1】:

fpassthru() 将在较低级别执行您正在执行的操作。像这样使用它:

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

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

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

即使它可能是一个 csv 文件,也没有必要限制自己使用 csv 函数,除非您在输出时生成文件。

如果您将 CSV 流式传输到输出而不是文件,您可能会看到性能提升。

【讨论】:

  • 我正在从数据库中生成一个大的 .csv 文件。使用 php 提供的内置函数总是更快。感谢 fpassthru() !我今天学到了一些东西:)。
【解决方案2】:

为什么需要将 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;

【讨论】:

  • 因为他使用 fputcsv( ) 将任意数组转换为 CSV 字符串。 PHP中没有stringtocsv函数,afaik。
  • 如果$csv_row 是一个数组,那么你只需要用分隔符将它内爆即可。 echo implode(',', $csv_row)."\n";.
  • 实际上,CSV 非常复杂,而且您严重低估了它。例如,分隔符必须被转义,分隔符也是如此。如果数组中的值是“foo, bar, baz”,则内爆想法将生成一个损坏的 CSV 文件。这比你想象的要难。
  • @BerryLangerak 我知道。但是你总是可以自己逃跑,这并不复杂。
  • 是的,它一件复杂的事情。但无论如何;试试看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
  • 1970-01-01
相关资源
最近更新 更多