如何从大型数据库导出CSV? 我遇到了超时错误。
我的表中有超过1GB的数据。 如果我尝试使用自定义方法创建CSV,则服务器会通过超时错误。
答案 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;