WordPressのCSVインポートを実装したときにQueryMonitorがメモリを食い過ぎて大変なことになったのでメモ


QueryMonitorはWordPressのデバッグには欠かせない超便利なプラグインで、開発には欠かせない。
参考:QueryMonitor

具体的には、

  • サーバー環境などの情報を一覧で確認できる
  • WP_DEBUGがOFFでもPHPエラーを拾って通知してくれる
  • 現在のテンプレートを表示するまでに発行したデータベースクエリの一覧が見られる
  • 現在のテンプレートを表示するためのリライトルールなどを事細かに表示してくれる
  • ページ表示にかかった実行時間を表示してくれる

など、ある程度のサイトを作るならば絶対に入れておいて損はないプラグインなのだが、どうやら内部的に独自のキャッシュ機構を使ってデータを保存しているようで、CSVインポートなどの仕組みと致命的に相性が悪い。

CSVインポートなど内部でループを使い行を処理するような仕組みの場合、内部で wp_insert_post や wp_update_post, wp_insert_term などデータベースに関わるようなクエリを発行するたびに全クエリをQueryMonitorが記録してしまうため、100件程度登録しただけでメモリエラーが発生することになる。

この独自のキャッシュ?は wp_cache_flush や wpdb::flush などのキャッシュクリア系の関数・メソッドを利用してもクリアできないため、ループで大量の投稿(やタクソノミー)を追加・変更するような場合にメモリエラーが起きた場合には、まずQueryMonitorプラグインを疑ってみた方が良い。