PHPのメモリ使用量を削減する3つのコツ
PHPはメモリとの戦い
メモリを抑えた設計にしないと高級サーバーが必要になってしまう。
安いVPSで運営するためにはメモリ最小限が大事。
というところのコツの話。
まずメモリの使用量について
主に下記3つに大きく使います。
・システムとしての必須ファイルの読み込み
・ファイルの読み込み
・変数への代入
システムファイルは仕方がないので、
開発者側が作るファイル、そして変数をどうにかする必要がある。
という当たり前の話から…
1、読み込むファイルを小分けにする
使わないものまで読み込まない。
例えば、「関数ファイル」は全部読み込んでしまいがちです。
使わないのにとりあえず読む=メモリの無駄です。
関数を使う時だけその関数を読み込むようにしたい。
CSV的なデータも全部を読み込むとメモリを多量に消費します。
そんなデータはあらかじめ小分けして、必要な部分のみ読み込む。
1データごとファイルを分けるくらいが良い。
できるだけ小分けすることでメモリを抑えられる。
面倒だけど一番効果がある対策です。
2、何でも変数に代入しない
includeした本文を変数に代入とかダメ絶対。
記事本文ならファイルをincludeするだけで表示できる。
それを変数に代入して、「echo 変数」とか無駄でしかない。
メモリ消費量が2倍になってしまいます。
この「読み込んで変数に代入」というのは無駄の極みです。
できるだけincludeだけで処理できるようにしたい。
あらかじめ処理したデータをファイルにしておくのがベスト。
特に配列あたりに気を付けたい。
3、必要なデータだけ取得する
例えばPDOだと「FETCH_ASSOC」を指定する。
デフォルトでは配列が2重になった状態で取得されます。
シンプルな配列で取得すればメモリ消費量が半減する。
APIなんかも必要なデータだけ選択するのが大事です。
<FETCH_ASSOCで取得した配列とデフォルトとの違い>
//$stmt->fetchAll(PDO::FETCH_ASSOC);
array(1) {
[0]=>
array(1) {
["cat"]=>
string(6) "ubuntu"
}
}
//デフォルト(PDO::FETCH_BOTH)
//$stmt->fetchAll();
array(1) {
[0]=>
array(2) {
["cat"]=>
string(6) "ubuntu"
[0]=>
string(6) "ubuntu"
}
}
デフォルトでは「変数[0]」としても取得できるようになっています。
ほとんど場合において無駄なので、FETCH_ASSOCを指定しよう。
そもそもPDOを使わず自力でDBから取得するという手もある。
(「new PDO」とDBにログインするだけで約41KB消費)
--
配列はできるだけシンプルにしたい。
連想配列にするだけでメモリ消費量は跳ね上がります。
面倒だけど一つ一つ配列を分けて保存したい。
このあたり、PHPの仕様や関数を理解することが大事。
まとめ
小さなデスクで作業するイメージでやるとメモリ使用量を削減できる。
コードもファイルも少なく上級者的に構築すると、メモリを多量に使いがち。
見た目は悪くなりますが、細かく取得・保存する設計にしたいです。
「メモリはプログラミングを楽をするもの」と思っています。
「えー!めんどくさい!」と思うようなことをやればメモリ消費量は減るはずです。
サーバー代削減のためにも頑張ろう。
※自分しかわからないコードの出来上がり