php導出百萬數據CSV

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空間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章