PhpSpreadsheetが複数ファイルをループするとメモリを使いすぎる
PhpSpreadsheetでxlsxファイルを処理しているときにメモリエラーが出たので調査したときの覚書。 環境: Windows 11 pro, PHP 8.3.13, PhpSpreadsheet 3.5.0 数メガある10個ほどのxlsxファイルをループ処理したら下記エラー。 PHP Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 4096 bytes) in D:/../ 次のファイルを読み込むごとにメモリ消費が増えていく。 PhpSpreadsheetはIteratorを使ってメモリ消費を最小限にしているはず。 参考: Looping the Loop - PhpSpreadsheet Documentation 試したこと php.iniのmemory_limitを1024Mにした。 Loop中にmemory_get_usage()を出力して、どこでメモリ消費するか計測。 xlsxをload前にsetReadDataOnly(true)する。 → 変わらなかった。 Loopの最後で変数をunsetする。 → 変わらなかった。 10,000行の1MBのxlsxファイルをloadするとメモリ126MBを消費した。 memory_limit=1024Mだと8MB(約80,000行)のファイルを処理するのが限界。 フォルダに置いたxlsxファイルをループして処理したかったけど、一つずつ別スレッドで処理(1つのPHPコマンドで1ファイル処理)するようにした方が良さそう。 【関連記事】 Windows11にPHP8.3とComposerをscoop経由でインストール 病院の施設基準を自動更新するには? PHPでExcelを扱うライブラリPhpSpreadsheetをインストール 【PHP】PHPExcelがループ内でメモリを使いすぎる