我在一个返回任意行数的数据库上执行SELECT,可能很少或很多(一百万+),这些行需要进入带有第一行标题的.csv文件。
我知道使用PHP导出CSV文件的两种方法:使用输出缓冲区foreach ($families as $family) {
$parents = array_map(function ($person) {
return $person['firstname'];
}, array_filter($family, function ($person) {
return !empty($person['primary']);
}));
$children = array_map(function ($person) {
return $person['firstname'];
}, array_filter($family, function ($person) {
return empty($person['primary']);
}));
if (count($parents)) {
echo 'Family : ' . implode(',', $parents) . '<br />';
}
if (count($children)) {
echo 'Children : ' . implode(',', $children) . '<br />';
}
}
或创建临时文件,将其提供给用户,而不是删除它。
哪种方式更好,知道它可能是一个小文件还是一个非常大的文件?考虑PHP内存限制(在php.ini中),请求超时等等。
答案 0 :(得分:2)
如果你有大文件,使用临时文件是唯一不错的选择。
答案 1 :(得分:1)
我认为答案很明显:直接写给0x30000000
。它与php://output
相同;输出将或多或少直接发送给客户端。它可能会或可能不会缓冲一点,但除非您激活显式输出缓冲或您的Web服务器有一个非常大的缓冲区,它将直接发送它。 “发送文件”(可能是通过echo ..
)会通过相同的输出缓冲区传递数据,但会更加复杂且容易出错。
答案 2 :(得分:1)
这取决于具体情况。
当您知道文件不是非常大且下载不经常发生时,请使用输出缓冲区。
当你有大量的东西时,会被大量下载(同时),将它写入文件可能会更好地减轻数据库和网站的负担。