一般的なwebアプリケーションを作る際、どういったケースでメモリ使用量を気にすればいいかがあまり解っていなかったので、よくありそうなケースで測定してみた。
結論
- 扱うデータによる(なので画像処理は結構使用する)
- バッチ処理時はどのタイミングでリセットされるかを考慮しておいたほうがいい
使用量の取り方
測定箇所の前後でmemory_get_usageを呼び出し、差分をとる。
http://php.net/manual/ja/function.memory-get-usage.php
基本仕様
- 関数を抜ける際に、参照数が0のものはリセットされる。
ケース
DBから数件データを取得して、表示する
例)cakephpのブログっぽいサイトでのデータ取得時
10件: 100KB
100件: 800KB
単純にデータの量が反映される?
普通に1ページ分の表示量なら考慮する必要がないレベル.
アップロードされたファイルをサーバー上に保存する
tmpフォルダに保存されたファイルを指定ディレクトリに移動するだけなので、メモリ使用なし
画像のサムネイルを作成する
いくつか試してみた結果、元の画像サイズ * 10ほどメモリを使用している?
仮説: 元画像のビットマップ容量 + サムネイル画像のビットマップ容量
バッチ処理
扱うデータによる。
一度に大量のデータを処理する場合はそのデータ分だけメモリを使うことになる。
メソッドを分割することで、ピーク使用量は抑えられそう。
参考
-
PHP5系のarrayが実際に必要とするメモリについて https://nikic.github.io/2011/12/12/How-big-are-PHP-arrays-really-Hint-BIG.html
Integer(8byte)を格納する配列の場合、型付言語(Cのような)で想定される使用量の18倍かかる -
PHP7のハッシュテーブル実装について
https://nikic.github.io/2014/12/22/PHPs-new-hashtable-implementation.html
上記のPHP5系の実装では要素ごとに144byteのラッパーが必要だったが、PHP7では36-32byteまで減ってるらしい。 -
PHPの変数の格納について
http://php.net/manual/ja/internals2.variables.php