1

1 つの 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();

助言がありますか?

4

2 に答える 2

2

fetchAllが問題です。それが行うことは、テーブルから一致するすべての行を取得し、すべてをメモリにロードすることです。フェッチする行があまりない場合は機能しますが、格納する行数が使用可能なメモリ量を超えると、メモリ不足エラーが発生します。

この問題を解決するには、データを複数のチャンクでフェッチする必要があります。fetch代わりにメソッドとカーソルを使用できます。PHP.net のマニュアルで詳しく説明されています。次のレポから取得することもできます: https://github.com/adrilo/spout-pdo-example。これは、スケーラブルな方法で MySQL と Spout を一緒に使用する例を示しています。

于 2016-10-14T06:04:56.253 に答える
0

SELECT * FROM your table name into out file 'folder path / yourlfilename.extension ' を使用することをお勧めします。要件に合わせてクエリをカスタマイズします。要件に合わせて簡単にカスタマイズできます。mysqlをoutfile関数に入れるだけです。巨大なデータの場合、これが最適なソリューションです。最後のフォルダーのアクセス許可が「777」であり、その名前のファイルが存在しないことを確認してください。クエリは、それ自体でファイルを生成します。

于 2016-10-27T17:08:46.973 に答える