inc2734 / mw-wp-form

69 stars 46 forks source link

CSVダウンロード時のメモリ使用量を削減 #52

Closed zenith6 closed 8 years ago

zenith6 commented 8 years ago

51 に関するPRです。

[Download All] チェック時のCSVダウンロード処理に対して、 使用メモリを減らすように変更しています。

分割時の取得件数は、1ページの表示件数を引き継いで使用するようにしています。 別途設定を設けた方がベストだと思いますが、手抜きしちゃいました><

CSVのヘッダー出力の仕様ですが、 出力範囲内の問い合わせデータに基づいて、カラムを取得するように変更しました。 また1ページ目のみの出力、2ページ目のみの出力でカラムが異なる可能性がありますが、 こちらは旧来の挙動を引き継いでおります。


以下廃案。 ~~1ページ目で取得可能なカラムのみを出力し、 2ページ目以降に出現するカラムは名無しのカラムとして扱うよう実装しています。 一度総なめして正確に取得するかどうか悩みました… とりあえず実行速度を優先にしています。 このあたりよろしければご判断をお願いできましたら幸いです。~~

問い合わせデータ

ID 項目名
1 A 1
1 B 1
2 B 2
2 C 2

CSV出力結果

ID A B
1 1 1
2 2 2
inc2734 commented 8 years ago

ありがとうございます! 僕がメモリの扱いとかに詳しくないので質問なのですが、get_posts() をループで複数回呼び出し、そのたびに wp_cache_flush() させることが使用メモリを減らすためのポイント、ということになりますでしょうか?

1ページ目で取得可能なカラムのみを出力し、 2ページ目以降に出現するカラムは名無しのカラムとして扱うよう実装しています。 一度総なめして正確に取得するかどうか悩みました…

フォーム運用の種類によっては項目が変わることはありえると思いますので、ここはカラム無しにはならないほうが理想です。

時間がとれるときに僕の方でもコードの確認・動作確認したいと思います!

zenith6 commented 8 years ago

早速のご確認ありがとうございます!

get_posts() をループで複数回呼び出し、そのたびに wp_cache_flush() させることが使用メモリを減らすためのポイント、ということになりますでしょうか?

はいその通りです。 取得分割はピーク使用量を低下させるために、 wp_cache_flush() は投稿データが WP_Object_Cache に蓄積される事への対策で呼び出しています。 WP_Object_Cache::$cachepostsmeta だけ解放できる方法が見付からなかったため全体を解放にしてます。

フォーム運用の種類によっては項目が変わることはありえると思いますので、ここはカラム無しにはならないほうが理想です。

おっしゃられる通りですね! 挙動が変わらないよう変更致します。 実行時間が延びるため、max_execution_time の対策が必要になるかと思います。 set_time_limit(0) を入れれば平気かなと考えます。 これは別PRを立てた方がよろしいでしょうか?

zenith6 commented 8 years ago

1a767f2faaaabf7d40e60cd150ea2047a7c37056 にて、カラムの出力の挙動を従来と同じになるよう修正致しました。 ご都合のよろしい時にでも、ご確認頂けましたら幸いです!

inc2734 commented 8 years ago

Refactoring MW_WP_Form_CSV 88ec314b0936e4be425a2b55c6e59630e2e2d2be

inc2734 commented 8 years ago

Update version df04ff0ebae2a1d9e926ac72d4b94859f4577566

zenith6 commented 8 years ago

マージありがとうございます!