我想使用PHP 5.4.24和freetds 0.91从SQL Server 2008R2上的表(或视图)中读取数据。 在PHP中,我写道:
$ret = mssql_query( 'SELECT * FROM mytable', $Conn ) ;
然后我一次读取一行,处理它们,一切都好。除非,当表格真的很大时,我得到一个错误:
Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 4625408 bytes)
in /home/prove/test.php on line 43
错误发生在mssql_query()中,所以我查询的方式无关紧要。
更改查询以返回更少的行或更少的列是不可行的,因为我必须在有限的时间内从许多表中读取大量数据。
我该怎么做才能说服PHP一次一行地读取内存,或者一次读取一个合理的数字?
答案 0 :(得分:0)
我在问题评论中同意@James,如果你需要阅读一个如此大的表,它会耗尽你的记忆以便在回复PHP之前存储结果,这可能只是意味着你需要找到一个更好的方法。但是,这是一个可能的解决方案(未经测试,我只使用过几次MSSQL;但如果不完美,我会尽我所能):
$ret = mssql_query( 'SELECT COUNT(*) as TotalRows FROM mytable', $Conn);
$row = mssql_fetch_row($ret);
$offset = 0;
$increment = 50;
while ($offset < $row['TotalRows'])
{
$ret_2 = mssql_query("SELECT * FROM mytable ORDER BY Id ASC OFFSET {$offset} ROWS FETCH NEXT {$increment} ROWS ONLY", $Conn);
//
// loop over those 50 rows, do your thing...
//
$offset += $increment;
}
//
// there will probably be a remainder, so you'll have to account for that in the post-iteration; probably making the interior loop a function or method would be wise.
//