別の質問の際の続きになるのですが、ZendFrameworkのメモリ利用率などでサーバー会社とやりとりして際に、
サーバー会社から言われた事なのですが、ZendFrameworkを正しく使うにはZend Coreを使わなければいけないと言われました。
理由を聞きますと純粋なPHPのコードで記述するだけではZendFrameworkで確保したメモリの領域は使用されずにそれ以外のメモリ領域を使用するため無駄になるそうです。
具体的に正しく使う記述方法は?と聞くと、下記のURLが送られてきました。
http://php.net/manual/ja/internals2.ze1.zendapi.php
サーバー会社の言い分としてはZendFrameworkを使うならここら辺のメソッドを使って、
PHP上で変数の宣言やループ処理やデータベースの接続などをしないと意味がないとの事でした。
それとZendFrameworkが確保するメモリ領域はOSが確保する最低限必要な20%以外の全てで80%を確保するとのことでした。
ピュアなPHPコードでZendFrameworkを利用していると折角確保している80%を使わずに20%で処理することになるのでメモリの無駄とのことでした。
サーバーが会社が言ってる事は正しいのでしょうか?
別質問のメモリ利用率などの質問はこちらになります。
http://q.hatena.ne.jp/1266490040
おかしな点がいくつかあるため、サーバ会社側の回答がおかしいのか聞き違いなのかがハッキリしない。
まずは整理だが、Zend Core はphpやデータベースなどを一まとめにしたパッケージを差している。phpのコアであるZendと間違いそうではあるが違うものである。
http://www.atmarkit.co.jp/fwin2k/verification/web200802/web20080...
http://www.zend.co.jp/product/zendcore2.html
ZendFramework は phpのフレームワークであり、上記Zend Coreというパッケージにも含まれるが下からダウンロードして既存のphp環境にセットアップすることもできる。
http://framework.zend.com/manual/ja/introduction.installation.ht...
WEBサーバの場合だが、phpが使うメモリはapacheの子プロセスから分け与えてもらう。
少し脱線するがapache1.3系の場合は子プロセスを使いまわす事によって子プロセスは肥大をつづけ、1回目は0.2%、2回目は0.5%(丸めの関係で0.4ではないのだろう)といった具合になる。これはメモリリークではなく仕様。対処として子プロセスの常駐数をある程度確保した上で、phpセッション終了時に使った子プロセスを破棄するといった方法などで逃げた経験がある。apache2系ならば改善されているため肥大していっても対処してくれるようで、これに関しては特別な対処はしていない。私の思考と対処が正しいなどとは断言できないが参考にしてくれればと思う。
話を戻すが、apache関連のプロセス用に与えられたメモリが全体の2割程度という事なのだろう。
データベース用やファイルキャッシュなどもあるからして8割というのは言葉のあやだと思われるが、確かに素のphpでは与えられた2割の範囲内でしか活動できない。出来たとしたら越権行為で秩序がなくなる。
越権行為ではなく、正規の手続きとして残りの8割から割り当てを増やしてもらう方法がある。それがZendFrameworkのZend_Cacheなどだ。本来与えられたものより多くのメモリを使うことが出来るようになるというのだから、うまく使えば足かせとなるHDDとのやりとりなども減り、メモリ不足分を補うようなこともできる。その意味では素のphpでは無駄ということになるがZendFrameworkを通じてメモリ確保していない場合、OSは空いているメモリを自動的にファイルキャッシュとして利用するため必ずしも無駄になるとは言えない。
ZendFrameworkを使う事が有効かどうかは目的によるので一概には言えないがデータベースを併用するようなシステムであれば使うほうが良いとは思われる。だがしかし、サーバのメモリ管理等も含めて相当のスキルが無ければ逆に足かせになる可能性があることも覚えておいたほうがいいだろう。
ざっくりとだが、とりあえず以上。
貴重な情報ありがとうございます。
とても参考になりました。
>phpのコアであるZendと間違いそうではあるが違うものである。
サーバー会社側に御社がZendと呼ばれているものはZendEngineと勘違いしていませんか?
みたいな事を聞きましたがわかってもらえなかったです。
サーバー会社が送ってきた回答分をそのまま記載させて頂きますが、
「まず、サーバ全システムが搭載するメモリに対して電源を入れてOSが起動し最低限の
アプリケーションを起動するためにOSが確保するメモリーが20%程度あるという事です。
OSは残ったメモリーに対して、メモリー要求があるアプリケーション(この場合APACHEとZEND、PHPなど)
に空いている全てを割り当てます。
ZENDはこの最大容量の割り当てサイズをメモリーリークを起こす限界点として認識し確保します。
稼働中この幅が超えないようZENDは厳密なメモリー管理を行えるのです。
先にお送りしたZEND公式ドキュメントに記載があるとおり、ZENDがメモリーの管理を厳密に行うには、
ZENDが提供する命令セットを活用する必要がありますので、公式ドキュメントをご参考ください。
また、システムが稼動するために、CPUはより必要なメモリーを必要とすれば、
アプリケーション(この場合ZEND)は、使えるメモリーの上限値が変更された事を認識します。
しかし、PHPなどピュアなアプリはメモリの管理が良い意味で曖昧なので、この変更を認識できません。
APACHEの一部なので当然なのですが、プログラムの仕方でCPUの使用域まで使ってしまう事があります。」
と、回答を頂きました。
この文章を読んでみても恐らくZendFrameworkとZendEngineを勘違いしてるのかな?って感じを私は感じていました。
前回の質問のメモリ利用率が上がってしまう件の方で新たにサーバー会社から回答が頂けまして、
メモリ利用率が増えてから暫くたっても解放されないのは、
Zendによるアクセラレータが原因とのことでした。
そちらの設定で解除の設定を正しく行えば解決しますと言われましたが、
ZendによるアクセラレータとはZend OptimizerやKm1967さんが仰ってるZend_Cacheなどだと思っていまして、
特にこちらは使用してない状況です。
こちらの機能はデフォルトで勝手に使われたりするものなのでしょうか。
(サーバー会社にZendによるアクセラレータと呼んでいるものはZend Optimizerですか?と質問をしていますが回答が返ってきません)
また話を聞いていてZendFrameworkをセットアップした時点で
メモリが8割確保されてしまうという点が良く分かりませんでした。
(Zend OptimizerやZend_Cacheを使用していなくても)
そのせいで物理メモリが4G搭載されているが常にMAX近くまで使われていますと言われた事と、
ZendFrameworkを正しく使う方法として送られてきたURLに記載されているZendEngineのZend APIなどを使用しなければいけないのか。
という点がさっぱりでした。
私の認識が間違っているのかもしれませんが、
Zend APIとはモジュールやエクステンションを作成する場合に使用されるもので、
PHPでなくC言語で書かれいるものだと私は思っていますので、
ZendFrameworkを正しく使うならPHPではなくてC言語で書かないといけないと
サーバー会社が言ってるように聞こえてしまうのです・・・。
確かにZendEngineがC言語?で動いてるわけですから、
C言語で書けばメモリの管理とかも正確に記述しいけば最大限のパフォーマンスを発揮できるとは思いますけど、
そういう作りでなければZendFrameworkが勝手に8割確保したメモリが使われないような仕組みで、
ZendFrameworkが作らているようには思えないのです。
そういう仕様でZendFrameworkが作られているのであれば、
結構重要な事だと思いますので公式ドキュメントや参考書などにも書かれていると思うのですが、
私が探したところですと見当たりませんでした。
>だがしかし、サーバのメモリ管理等も含めて相当のスキルが無ければ逆に足かせになる可能性があることも覚えておいたほうがいいだろう。
私もこの点は懸念しておりまして、
プログラム側にそういった部分があるのであれば改善したいという気持ちがあり色々調査や情報の方を収集をしている状況でした。
気をつけて使いたいと思っております。