Загрузка всего файла в память через stream_get_contents()
, вероятно, то, что вас убивает.Вам нужно не только хранить данные base64 (которые обычно составляют около 33% от их необработанного содержимого), но и накладные расходы csv.Если проблема с памятью, подумайте о том, чтобы просто вызвать приложение gzip из командной строки вместо gzipping внутри PHP, что-то вроде:
... database loop here ...
exec('gzip yourfile.csv');
И, вероятно, вы можете немного лучше оптимизировать вещи внутри цикла DB, икодировать на месте, а не создавать новый массив для каждой строки:
while($row = mysql_fetch_row($result)) {
foreach ($row as $key => $val) {
$row[$key] = base64_encode($val);
fputcsv($fh, $row, chr(9));
}
}
Не то чтобы это значительно уменьшило использование памяти - это всего лишь одна строка данных, поэтому, если вы не имеете дело с огромной записьюполя, это не будет иметь большого эффекта.