我只想仔细检查使用从数据库检索的数据使用PHP写入CSV文件的最有效方法。
目前在执行我的sql查询以检索数据后,我使用while循环将数据分配给变量,然后在while循环中写入文件。 像这样
$fp = fopen("../" . $this->portal . "/" . $this->folder . "/" . $this->fileName . ".csv", 'a+');
$data = array();
while ($row = sqlsrv_fetch_array($getList, SQLSRV_FETCH_ASSOC)) {
$data['id'] = $row['id'];
$data['empId'] = $row['empId'];
$data['fullname'] = $row['fullname'];
$data['title'] = $row['title'];
$data['department'] = $row['department'];
fputcsv($fp, array_values($data));
}
fclose($fp);
我想知道将每次迭代的数据分配给csv格式的字符串变量是否更快,然后在整个循环中连接它。 然后一旦循环完成,将该变量写入文件? 这会更快吗?或者是否还有另一种方法可以写入更有效的csv文件?
答案 0 :(得分:2)
从您的示例来看,似乎PHP没有对数据做任何事情,那么为什么不避免几乎所有的PHP交互呢?大多数数据库都有完全避免使用PHP并直接编写CSV文件的方法
e.g。 MySQL SELECT ... INTO
来自示例:
SELECT a,b,a+b INTO OUTFILE '/tmp/result.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM test_table;
答案 1 :(得分:-1)
如果你能负担将整个文件留在内存中,我会这样做:
$outarr = array();
while ($row = sqlsrv_fetch_array($getList, SQLSRV_FETCH_NUMERIC)) {
array_push($outarr,implode(";",$row));
}
file_put_contents("../" . $this->portal . "/" . $this->folder . "/" . $this->fileName . ".csv", implode($outarr,"\n"));
有一些权衡取舍: