Обработка fetchAll из огромного запроса MySQL без ошибки предела мемо

Я пытаюсь получить огромное количество данных из одной таблицы MySQL для экспорта в виде файла XLSX.

Я использовал функцию fetchAll (), но я получил

Fatal error: Out of memory

Вот мой код:

<?php
require_once 'classes/Spout/Autoloader/autoload.php';
use Box\Spout\Writer\WriterFactory;
use Box\Spout\Common\Type;

$query  = "SELECT *
FROM full_report";

$header = array('DATA','STORE','FROM','TO','DATE','YEAR','MONTH','ITEM','SIZE','DEPT','SUBDEPT','DESC1','DESC2','GENDER','ATTR','VEND','SEASON','INVO#','TRANS#','QTY','MSRP','RTP','COST','T.RTP','T.COST','PAYMENT','STATUS');

$mDb->query($query);
$result = $mDb->fetchAll(); // Here where I get the error!

$fileName = "fullReport-" . date('m-d-Y-H-i-s') . ".xlsx";
$path     = "_uploads/" . $fileName;

$writer = WriterFactory::create(Type::XLSX); // for XLSX files
$writer->openToFile($path); // write data to a file or to a PHP stream
$writer->openToBrowser($path); // stream data directly to the browser
$writer->addRow($header);

foreach ($result as $value)
{
unset($value['id']);
unset($value[0]);
$valuex[] = array_values($value);
}
$writer->addRows($valuex);
$writer->close();

Какие-либо предложения?

1

Решение

fetchAll это проблема. Он получает все подходящие строки из таблицы и загружает все в память. Он работает, когда у вас не слишком много строк для извлечения, но вызывает ошибки «Недостаточно памяти», когда количество сохраняемых строк превышает объем доступной памяти.

Чтобы решить эту проблему, вы должны получить ваши данные несколькими порциями. Вы можете использовать fetch метод вместо и курсор. Это хорошо документировано в руководстве по PHP.net. Вы также можете взять в этом репо: https://github.com/adrilo/spout-pdo-example. Это дает вам пример совместного использования MySQL и Spout в масштабируемой форме.

2

Другие решения

Я предложу вам использовать SELECT * FROM из имени вашей таблицы в наш файл ‘path path / yourlfilename.extension’; настроить запрос с вашим требованием. Он может легко настроить с вашим требованием. Просто изучите mysql в функции outfile. В случае больших данных это лучшее решение. Убедитесь, что ваша последняя папка имеет разрешение «777» и что файл с таким именем не существует. Запрос генерирует файл с самим собой.

0

По вопросам рекламы [email protected]