PHP使用fputcsv有效地编写和输出csv文件

时间:2012-08-31 08:19:52

标签: php file fputcsv

在编写.csv文件时,我使用fputcsv,如下所示:

- open a temporary file $f = tmpfile();
- write content to file using fputcsv($f,$csv_row);
- send appropriate headers for attachment
- read file like this:

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

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

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

另一个方法是:

- open file $f = fopen('php://output', 'w');
- send appropriate headers for attachment
- write content to file using fputcsv($f,$csv_row);
- close $f stream

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

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

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

急切地等待你的意见。

感谢。

2 个答案:

答案 0 :(得分:0)

fpassthru()会做你在较低级别所做的事情。像这样使用它:

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

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

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

即使它可能是csv文件,也不需要将自己限制为csv函数,除非您在输出时生成文件。

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

答案 1 :(得分: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;