PHP 使用 fputcsv 高效地写入和输出 csv 文件

Posted

技术标签:

【中文标题】PHP 使用 fputcsv 高效地写入和输出 csv 文件【英文标题】:PHP efficiently write and output csv files using fputcsv 【发布时间】: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 是的,你是对的。我将尝试对此进行基准测试并发布结果。 【参考方案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 我知道。但是你总是可以自己逃跑,这并不复杂。 是的,它一件复杂的事情。但无论如何;试试看。

以上是关于PHP 使用 fputcsv 高效地写入和输出 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

获取 PHP 错误警告:fputcsv() 期望参数 2 为数组

在 PHP 中将 CSV 写入不带附件的文件

php怎么导出大量数据的Excel

PHP fputcsv 编码

php使用fputcsv进行大数据的导出

fputcsv 将 HTML 代码插入 csv 文件