使用mysqli以块方法从大数据导出Csv

时间:2016-06-23 12:30:00

标签: csv mysqli export-to-csv chunks

如何从大型数据库导出CSV? 我遇到了超时错误。

我的表中有超过1GB的数据。 如果我尝试使用自定义方法创建CSV,则服务器会通过超时错误。

1 个答案:

答案 0 :(得分:-1)

如果您的表中有更多数据并且想要在csv中导出,那么您将遇到异常/时间执行错误。

我有一个下面提到的更好的解决方案,也经过了全面测试。 请使用和享受。

<?php 
ini_set('display_errors',1);
set_time_limit(0);
$mysqli = new mysqli("localhost", "root", "", "demo");
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
$limit = '';
$sql ="SELECT * from user";
$result = $mysqli->query($sql);
$row_cnt = $result->num_rows;
$fileName = 'report.csv';
header("Content-disposition: attachment; filename={$fileName}");
header("Content-Type: text/csv");
$rounds='';
if($row_cnt>0){
    $processAtOnce = 10;
    if($row_cnt>$processAtOnce){
        $rounds = round($row_cnt / $processAtOnce);
    }else{
        $rounds = 1;
        $processAtOnce = $row_cnt;
    }   
    $fp = fopen('php://output', 'w');
    for ($i = 0; $i < $rounds; ++$i) {  
        $limit = $processAtOnce;
        $offset = $i * $processAtOnce;
        $sql1= $sql .' limit '.$offset. ','.$limit;
        $result1 = $mysqli->query($sql1);       
          while ($row = $result1->fetch_assoc()) {
            fputcsv($fp, $row);
        }

    }
    unset($result1);
    unset($result);
}

----------数据库----------

CREATE TABLE `newdemo` (
  `id` int(11) NOT NULL,
  `uname` varchar(100) NOT NULL,
  `roll` int(11) NOT NULL,
  `address` varchar(200) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Indexes for dumped tables
--

--
-- Indexes for table `newdemo`
--
  ALTER TABLE `newdemo`
   ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `newdemo`
--
ALTER TABLE `newdemo`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;