[PHP-users 32372] Re: memory_limitについて

Yasuo Ohgaki yohgaki @ ohgaki.net
2007年 7月 4日 (水) 02:06:53 JST


荒川 弘徳 さんは書きました:
> お世話になります。
> 
> memory_limitがコンパイルしていない環境について、ご経験がある方が
> いらっしゃいましたら、教えていただけないでしょうか。
> 
> -------------------------------------
> Linux
> PHP 4.4.4
> ※レンタルサーバ(ROOT権限なし)
> --------------------------------------
> 
> 1.メモリの制限について
> memory_limitがコンパイルされていれば、デフォルト8Mですが、
> コンパイルしていない場合、どのような制限があるのでしょうか。

メモリをいくら使ってもエラーになりません。
実際に利用可能なメモリまで使えるようになります。
# Cのmalloc()でエラーになるまで使える

> 
> 2.メモリ使用
> PHP に割り当てられたメモリの量を知りたいのですが、
> memory_get_usageコマンドがmemory_limitをコンパイル
> していないため、使えません。
> 
> memory_get_usage以外で他に、PHPのメモリの量を
> 知る方法はないのでしょうか。

PHPが使用しているメモリを知るのはあまり簡単ではありません。
memory_limitが有効な場合でもZendメモリマネージャを使わない場合、
使用しているメモリとしてカウントされません。

解りやすい例は、DBのクエリだと思います。
100万件のレコードを抽出クエリを実行するとDBのライブラリが100万件
分のレコードを保持する為のメモリ領域を確保しますが、このメモリ確
保にはZendメモリマネージャは利用されないので10GBでも確保できれば
確保してしまいます。

PHPが利用しているメモリだけではなくなりますが、PHPを実行している
ApacheのプロセスやCGIのメモリ使用量を知るならgetrusageが使えます。
http://jp.php.net/manual/en/function.getrusage.php

メールの内容からすると必要な情報はrusageの方だと思うのでこちらが
適切かと思います。

> 
> 
> 現在、運用しているシステムがいつAllowed memory size エラーが
> 発生するかひやひやしております。
> 
> メモリの量が制御できなければ、ソースを変更する手段を最終手段と
> 考えておりますが、あまりしたくないのです。。。

多分利用されているシステムにはlimitが設定されているのだと思います。
system('ulimit')などを実行すると利用できるメモリ量が分かるかも知れ
ません。

-- 
Yasuo Ohgaki : yohgaki @ ohgaki.net : http://www.ohgaki.net/



PHP-users メーリングリストの案内