下回り(asm, c, c++)を経験しているエンジニアはメモリ割当量は自分で管理するものと考えているはずですが、Lightweight Language専門のアプリケーションエンジニアはメモリ割当量をあまり気にしないようです…。

PHPメモリ制限の設定

PHPは、php.ini内のmemory_limitで設定された値までメモリを使用することが出来ます。例えば以下の設定であれば、実行中のPHPプロセスで2MBまでメモリを使用することが出来ます。

memory_limit=2M

PHP実行中にmemory_limitへ達してしまった場合、FATALエラーを出力して処理を停止します。PHPがapache moduleとして実行されている場合、以下の理由でmemory_limitの上限値を大きくしたくありません。

  • FATALエラーは例外ではないためトラップ出来ない(クライアントへレスポンス出来ない)
  • Apacheはブラウザからのアクセスを非同期で受け付ける(Apache側でクライアント接続タイミングを制御できない)
  • クライアント接続数は最大でMaxClientsの設定値まで増加する
  • クライアント1接続当たりApacheが1プロセス動作する(Linux版PHPではthreadが使えないのでforkする)

これが何を意味しているかというと、php.iniが正しく設定されない場合、Apacheの実行プロセスが使用するメモリ量が、サーバに搭載された物理メモリ量を超えてしまうことがあります。