ホームページ >バックエンド開発 >PHPチュートリアル >ファイルのエクスポート時のphpExcelのメモリオーバーフローの解決策

ファイルのエクスポート時のphpExcelのメモリオーバーフローの解決策

不言
不言オリジナル
2018-08-17 17:39:434734ブラウズ

この記事の内容は、ファイルエクスポート時のphpExcelのメモリオーバーフローの解決策に関するもので、一定の参考値があり、困っている友人は参考にしていただければ幸いです。

PHPExcel を使用してファイルをエクスポートする場合、ファイルが大きすぎるため、PHP のメモリ オーバーフロー エラーがよく報告されます。この問題を解決するには、PHPExcel が提供する最適化パラメータを使用できます。 。ここで言う Excel ファイルのサイズ超過とは、必ずしもファイル サイズを意味するわけではなく、ファイルに格納されているデータと形式が重要であり、データが多く、形式が比較的充実している場合、PHP のメモリを簡単に使い果たしてしまいます。

情報 2 は、キャッシュを有効にしないと Excel のセルが約 1K のメモリを占有し、8,000 行、31 列 (248,000 セル) のテーブルには 242MB のメモリが必要であることを指摘しています。キャッシュを有効にすると、80MB まで減少しますが、その効果は依然として非常に明らかです。

使用中は、PHPExcel のメモリ最適化パラメータは PHPExcel オブジェクトには含まれていないため、PHPExcel がインスタンス化される前に設定する必要があることに注意してください。

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
$cacheSettings = array( 'memoryCacheSize' => '512MB');
PHPExcel_Settings::setCacheStorageMethod($cacheMethod,$cacheSettings);

$oExcel = new PHPExcel();

PHPExcel_Settings::setCacheStorageMethod() のいくつかのパラメーター

セル データをシリアル化してメモリに保存

PHPExcel_CachedObjectStorageFactory::cache_in_memory_serialized;

セルをシリアル化し、Gzip を実行して圧縮して保存します。メモリ

PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;

一時ディスクファイルにキャッシュされるため、速度が遅くなる可能性があります

PHPExcel_CachedObjectStorageFactory::cache_to_discISAM;

php://temp

PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;

に保存されます

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_memcache;  
$cacheSettings = array( 'memcacheServer'  => 'localhost',  
    'memcachePort'    => 11211,  
    'cacheTime'       => 600  
);  
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);

memcache のメモリ使用量を削減するその他の方法

Excel のセル形式を読み取る必要がない場合は、データの読み取りのみを行うように設定できます。

$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load("test.xlsx”);

Excel に複数のシートがあるが、メモリ消費量を削減するために、そのうちの数枚だけを読み込むだけでよい場合は、これを設定することもできます。

$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objReader->setLoadSheetsOnly( array("Worksheet1", "Worksheet2") );
$objPHPExcel = $objReader->load("test.xlsx”);

シート内の特定の領域のみを読み取る必要がある場合は、フィルターを設定することもできます。

class MyReadFilter implements PHPExcel_Reader_IReadFilter
{
    public function readCell($column, $row, $worksheetName = '') {
        // Read title row and rows 20 - 30
        if ($row == 1 || ($row >= 20 && $row <= 30)) {
            return true;
        }

        return false;
    }
}

$objReader = PHPExcel_IOFactory::createReader(&#39;Excel2007&#39;);
$objReader->setReadFilter( new MyReadFilter() );
$objPHPExcel = $objReader->load("test.xlsx”);

最終的に、次の方法を使用しました

// 如果是因为特殊字符引起的,可以在load方法之前加上setReadDataOnly(意思是忽略任何格式的信息)方法,就可以避免 
$objReader->setReadDataOnly(true);//只需要添加这个方法
$objPHPExcel = $objReader->load($uploadFilePath);

関連する推奨事項:

phpExcel が大量のデータをエクスポートするときのメモリ オーバーフロー エラーの解決策

phpexcel エクスポートされた Excel ファイルの保存とダウンロードに関する問題

以上がファイルのエクスポート時のphpExcelのメモリオーバーフローの解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。