Php 分页查询耗尽内存
我想将一个大表导出到CSV,因为不可能一次选择所有数据并导出,我打开一个文件句柄来编写并调用这个函数,它接受一个查询并在不同的页面中循环,我调用它的页面大小为20,实际上很小,但在执行一段时间后(可能30分钟),这会导致以下错误:Php 分页查询耗尽内存,php,mysql,limit,Php,Mysql,Limit,我想将一个大表导出到CSV,因为不可能一次选择所有数据并导出,我打开一个文件句柄来编写并调用这个函数,它接受一个查询并在不同的页面中循环,我调用它的页面大小为20,实际上很小,但在执行一段时间后(可能30分钟),这会导致以下错误: Fatal error: Allowed memory size of 100663296 bytes exhausted (tried to allocate 85 bytes) in /usr/home/www/wp-includes/wp-db.php on l
Fatal error: Allowed memory size of 100663296 bytes exhausted (tried to allocate 85 bytes) in /usr/home/www/wp-includes/wp-db.php on line 1402
这是函数,$fichero是alraedy打开的文件句柄,$pagina_size在上一次测试中的值为20:
function sql2csv_streamed($fichero, $sql, $pagina_size=50)
{
global $wpdb;
$limite1 = 0;
$limite2 = $pagina_size-1;
$sql_pagina = $sql . " limit $limite1,$limite2";
error_log($sql_pagina);
// Add all values in the table
while ($rsSearchResults = $wpdb->get_results($sql_pagina, ARRAY_A))
{
foreach ( $rsSearchResults as $res )
{
fputcsv ($fichero, $res , ";");
}
$limite1 += $pagina_size;
$limite2 += $pagina_size;
$sql_pagina = $sql . " limit $limite1,$limite2";
error_log($sql_pagina);
}
}
谢谢是的,它就像是20个20个选择的3.500条记录,然后一个接一个地循环写入一个文件,当内存溢出时,该文件就像6 MB大,而且还没有完成。3500条记录什么都不是。应该在几秒钟内轻松完成。当我创建一个永无止境的循环时,我会遇到类似的错误。也许你应该试着打印出一些变量,然后只打印五次(直到记录结束),看看它的运行速度有多快。在运行过程中,我正在跟踪csv文件,数据正在正确写入,直到我得到错误,也许查询很复杂,我不知道,我会照你说的做,谢谢。它工作正常,此外,在表的一个小副本中,它生成一个正确的CSV文件。您对limite变量的计算有些错误,您正在增加limite1和limite2,而您只想增加偏移量(limite1)。那会有帮助吗?