PHP提供了fputcsv
函数可以直接操作csv文件。
function selectData()
{
$filename = 'export.csv';
$header = ['名字,年龄'];
ob_start();
header("Content-Type: text/csv");
header("Content-Disposition:filename=".$filename);
$fp=fopen('php://output','w');
// 插入头部信息
fputcsv($fp, $header);
// 循环查询数据
for ($i = 1; $i <= 100; $i++){
$data = 'select * from t_mall_order limit 0,' . $i * 1000;
if (empty($data)){
break;
}
export($fp, $data);
}
}
function export($fp, $data = []){
fwrite($fp, chr(0xEF).chr(0xBB).chr(0xBF));//转码 防止乱码(比如微信昵称(乱七八糟的))
$index = 0;
foreach ($data as $item) {
if($index==1000){
$index=0;
ob_flush();
flush();
}
$index++;
fputcsv($fp,$item);
}
}
可能遇到的错误:
Cannot modify header information - headers already sent by
buffer
buffer是 一个内存地址空间,Linux系统默认大小一般为4096(4kb),即一个内存页。主要用于存储速度不同步的设备或者优先级不同的设备之间传办理数据的 区域。通过buffer,可以使进程这间的相互等待变少。这里说一个通俗一点的例子,你打开文本编辑器编辑一个文件的时候,你每输入一个字符,操作系统并 不会立即把这个字符直接写入到磁盘,而是先写入到buffer,当写满了一个buffer的时候,才会把buffer中的数据写入磁盘,当然当调用内核函 数flush()的时候,强制要求把buffer中的脏数据写回磁盘。
同样的道理,当执行echo,print的时候,输出并没有立即通过server传给客户端浏览器显示, 而是将数据写入php buffer。php output_buffering机制,意味在server buffer之前,建立了一新的队列,数据必须经过该队列。当一个php buffer写满的时候,脚本进程会将php buffer中的输出数据交给系统内核交由server传给浏览器显示。所以,数据会依次写到这几个地方:echo/print -> php buffer -> server buffer -> browser
php output_buffering
默 认情况下,php buffer是开启的,而且该buffer默认值是4096,即4kb。你可以通过在php.ini配置文件中找到output_buffering配 置.当echo,print等输出用户数据的时候,输出数据都会写入到php output_buffering中,直到output_buffering写满,会将这些数据通过server传送给浏览器显示。你也可以通过 ob_start()手动激活php output_buffering机制,使得即便输出超过了4kb数据,也不真的把数据交给server传给浏览器,因为ob_start()将php buffer空间设置到了足够大。只有直到脚本结束,或者调用ob_end_flush函数,才会把数据发送给客户端浏览器。
我们将php.ini 中的 output_buffering 设置成为On就表明设置了无限大的buffer空间。