Я хочу читать данные из таблицы (или представления) на SQL Server 2008R2, используя PHP 5.4.24 и freetds 0.91.
В 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 читать в памяти по одной строке за раз или за разумное число за раз?
Я согласен с @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.
//
Других решений пока нет …