如何使导出文件导出更大的表格

时间:2017-04-21 12:37:52

标签: php mysql

我的导出文件只能导出有限数量的数据。这就是为什么我只导出从事件的uuid大于或等于772345开始的行。但是表中有更多的数据。有没有人有想法能够导出整个表格?

这是我使用的导出文件:

    <?php
$db_con = mysqli_connect("localhost", "root", "", "monitoring");
$result = $db_con->query('SELECT * FROM event where uuid >= 772345 and host != "" ');
if (!$result) die('Couldn\'t fetch records');
$num_fields = mysqli_num_fields($result);
$headers = array();
while ($fieldinfo = mysqli_fetch_field($result)) {
    $headers[] = $fieldinfo->name;
}
$fp = fopen('php://output', 'w');
if ($fp && $result) {
    header('Content-Type: text/csv'); 
    header('Content-Disposition: attachment; filename="event.csv"');
    header('Pragma: no-cache');
    header('Expires: 0');
    fputcsv($fp, $headers);
    while ($row = $result->fetch_array(MYSQLI_NUM)) {
        fputcsv($fp, array_values($row));
    }
    die;
}
?>    

这是我尝试将其全部导出时出现的错误: 致命错误:第3行的C:\ xampp \ htdocs \ exports \ export_event_all.php中允许的内存大小为134217728字节(试图分配1146880字节)

2 个答案:

答案 0 :(得分:0)

我通过改变解决了它     ;脚本可能消耗的最大内存量(128MB)     ; http://php.net/memory-limit     memory_limit的= 128MB 至     ;脚本可能消耗的最大内存量(128MB)     ; http://php.net/memory-limit     memory_limit的= -1 在C:\ xampp \ php \ php.ini

答案 1 :(得分:0)

另一种解决方案是告诉mysqli_扩展名不要缓冲查询结果。默认情况下,查询结果返回给PHP,所有行都存储在PHP内存中的数组中。

您可以使用

上的参数关闭此模式
$db_con->query('SELECT * FROM event where host != ""', MYSQLI_USE_RESULT);
  

http://php.net/manual/en/mysqlinfo.concepts.buffering.php

     

来自手册

     

默认情况下,查询使用缓冲模式。这意味着查询结果会立即从MySQL服务器传输到PHP,然后保存在PHP进程的内存中。这允许额外的操作,例如计算行数,以及移动(寻找)当前结果指针。它还允许在处理结果集时在同一连接上发出进一步的查询。缓冲模式的缺点是较大的结果集可能需要相当多的内存。内存将保持占用状态,直到未设置对结果集的所有引用或显式释放结果集,这将在请求结束时自动发生。术语“存储结果”也用于缓冲模式,因为整个结果集一次存储。

     

无缓冲的MySQL查询执行查询,然后在数据仍在MySQL服务器上等待获取时返回资源。这在PHP端使用的内存较少,但可能会增加服务器的负载。除非从服务器获取完整结果集,否则无法通过同一连接发送进一步的查询。无缓冲的查询也可以称为“使用结果”。

     

遵循这些特性,在您希望只有有限的结果集或需要在读取所有行之前知道返回的行数量的情况下,应使用缓冲查询。当您期望更大的结果时,应使用无缓冲模式。

因此,如果您更改此query(),则可以使用

<?php
$db_con = mysqli_connect("localhost", "root", "", "monitoring");
$result = $db_con->query('SELECT * FROM event where host != ""', MYSQLI_USE_RESULT);
//  the change                                                   ^^^^^^^^^^^^^^^^
if (!$result) die('Couldn\'t fetch records');
$num_fields = $result->field_count;
$headers = array();
while ($fieldinfo = mysqli_fetch_field($result)) {
    $headers[] = $fieldinfo->name;
}
$fp = fopen('php://output', 'w');
if ($fp && $result) {
    header('Content-Type: text/csv'); 
    header('Content-Disposition: attachment; filename="event.csv"');
    header('Pragma: no-cache');
    header('Expires: 0');
    fputcsv($fp, $headers);
    while ($row = $result->fetch_array(MYSQLI_NUM)) {
        fputcsv($fp, array_values($row));
    }
    die;
}
?>