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ファイル処理)するようにした方が良さそう。


【関連記事】