查询数据库并将结果写入文本文件

时间:2017-04-29 04:24:53

标签: php mysql

我有一个查询从数据库表中选择所有并将其写入文本文件。如果状态很小(例如最多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提出任何建议。

1 个答案:

答案 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++;
           }
        }