我有一个查询从数据库表中选择所有并将其写入文本文件。如果状态很小(例如最多200k行),代码仍然有效并将其写入文本文件。当我有一个查询时有2M行的状态时会出现问题,那么表中还有64列。
以下是代码的一部分:
$file = "file2.txt";
$fOpen = fopen($file, "a"); // Open file, write and append
$qry = "SELECT * FROM tbl_two WHERE STE='48'";
$res = mysqli_query($con, $qry);
if(!$res) {
echo "No data record" . "<br/>";
exit;
}
$num_res =mysqli_num_rows($res);
for ($i=0; $i<=$num_res; $i++) {
$row = mysqli_fetch_assoc ($res);
$STATE = (trim($row['STATE'] === "") ? " " : $row['STATE']);
$CTY = (trim($row['CTY']=== "") ? " " : $row['CTY']);
$ST = (trim($row['ST']=== "") ? " " : $row['ST']);
$BLK = (trim($row['BLK']=== "") ? " " : $row['BLK']);
....
....
//64th column
$data = "$STATE$CTY$ST$BLK(to the 64th variable)\r\n";
fwrite($f,$data);
}
fclose($f);
我尝试对查询设置限制:
$qry = "SELECT * FROM tbl_two WHERE STE='48' LIMIT 200000";
问题是,它只写到第200k行,并且不会写剩余的1.8m行。
如果我没有对查询设置限制,则会遇到错误Out of memory ....
。 TIA提出任何建议。
答案 0 :(得分:0)
首先,您需要使用缓冲区查询来获取数据Read it
默认情况下,查询使用缓冲模式。这意味着查询结果会立即从MySQL服务器传输到PHP,然后保存在PHP进程的内存中。
无缓冲的MySQL查询执行查询,然后在数据仍在MySQL服务器上等待获取时返回资源。这在PHP端使用的内存较少,但可能会增加服务器的负载。除非从服务器获取完整结果集,否则无法通过同一连接发送进一步的查询。无缓冲的查询也可以称为“使用结果”。
注意:如果您只希望获得有限的结果集,或者在读取所有行之前需要知道返回的行数,则应使用缓冲查询。当您期望更大的结果时,应使用无缓冲模式。
同样优化数组尝试直接放置变量,而你只需循环
pdo = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_pass');
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$uresult = $pdo->query("SELECT * FROM tbl_two WHERE STE='48' LIMIT 200000");
if ($uresult) {
$lineno = 0;
while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) {
echo $row['Name'] . PHP_EOL;
// write value in text file
$lineno++;
}
}