doudonn WEB制作やサーバーの話とかいろいろ

PHPのメモリ使用量を削減する3つのコツ

doudonn 更新日:
PHPのメモリ使用量を削減する3つのコツ

PHPはメモリとの戦い

メモリを抑えた設計にしないと高級サーバーが必要になってしまう。
安いVPSで運営するためにはメモリ最小限が大事。

というところのコツの話。

まずメモリの使用量について

主に下記3つに大きく使います。

・システムとしての必須ファイルの読み込み
・ファイルの読み込み
・変数への代入

システムファイルは仕方がないので、
開発者側が作るファイル、そして変数をどうにかする必要がある。

という当たり前の話から…

1、読み込むファイルを小分けにする

PHPのメモリ使用量を削減するためには、必要な分だけ読み込める構成にする

使わないものまで読み込まない。

例えば、「関数ファイル」は全部読み込んでしまいがちです。
使わないのにとりあえず読む=メモリの無駄です。
関数を使う時だけその関数を読み込むようにしたい。

CSV的なデータも全部を読み込むとメモリを多量に消費します。
そんなデータはあらかじめ小分けして、必要な部分のみ読み込む。
1データごとファイルを分けるくらいが良い。

できるだけ小分けすることでメモリを抑えられる。
面倒だけど一番効果がある対策です。

2、何でも変数に代入しない

PHPのメモリ使用量を削減するためには、変数に代入しなくてもできる設計を

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の仕様や関数を理解することが大事。

まとめ

小さなデスクで作業するイメージでやるとメモリ使用量を削減できる。

コードもファイルも少なく上級者的に構築すると、メモリを多量に使いがち。
見た目は悪くなりますが、細かく取得・保存する設計にしたいです。
「メモリはプログラミングを楽をするもの」と思っています。

「えー!めんどくさい!」と思うようなことをやればメモリ消費量は減るはずです。
サーバー代削減のためにも頑張ろう。

※自分しかわからないコードの出来上がり

PHP全般の関連記事

記事一覧はこちら:PHP全般

管理人について
doudonn
名前:doudonn(どうどん)
ひたすらWEB制作な人。
一応社長です。音ゲー好き

プロフィール
お知らせ

2022年11月30日に全記事削除しました。
無駄にページ表示速度にこだわってます。

役立ちサイト
wiki

プライバシーポリシー・広告について


© 2022-2024 doudonn All Rights Reserved.