ZendFrameworkについて。

別の質問の際の続きになるのですが、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

回答の条件
  • URL必須
  • 1人5回まで
  • 登録:
  • 終了:2010/03/15 12:55:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:Km1967 No.1

回答回数224ベストアンサー獲得回数35

ポイント60pt

おかしな点がいくつかあるため、サーバ会社側の回答がおかしいのか聞き違いなのかがハッキリしない。


まずは整理だが、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を使う事が有効かどうかは目的によるので一概には言えないがデータベースを併用するようなシステムであれば使うほうが良いとは思われる。だがしかし、サーバのメモリ管理等も含めて相当のスキルが無ければ逆に足かせになる可能性があることも覚えておいたほうがいいだろう。


ざっくりとだが、とりあえず以上。

id:nkjmhrk

貴重な情報ありがとうございます。

とても参考になりました。


>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が作られているのであれば、

結構重要な事だと思いますので公式ドキュメントや参考書などにも書かれていると思うのですが、

私が探したところですと見当たりませんでした。


>だがしかし、サーバのメモリ管理等も含めて相当のスキルが無ければ逆に足かせになる可能性があることも覚えておいたほうがいいだろう。

私もこの点は懸念しておりまして、

プログラム側にそういった部分があるのであれば改善したいという気持ちがあり色々調査や情報の方を収集をしている状況でした。

気をつけて使いたいと思っております。

2010/03/08 15:17:34
  • id:Km1967
    せっかく書いていただいた返答だが、まだまだツッコミどころ満載のようですな。このままQ&Aを続けてもなかなか埒はあかないだろう。
    多分、営業担当が適当に解釈して知ったかぶりで回答してきているのだろうから、技術者と直接コンタクトを取らせろというしかないと思う。 ご自身がある程度詳しければ自己解決してしまえば良いだけの話だが、いっそのこと、マネージドサーバに借り替えたほうが楽ではないかと思う。

    今のところ、私からの回答しかないが時間があれば、違った視点からは重要だから、もう1日くらい回答を待ってみてもいいかもしれない。とりあえず、私はこの件からは一時引っ込みます。
  • id:nkjmhrk
    Km1967さん

    私の知識不足のせいで色々分からない事が多いために、
    今は色々な情報が欲しい状態ですのでKm1967さんみたいな情報はとても参考になります。

    一応、この情報はサーバー会社の技術者でしかもその中でも一番の責任者の方からの説明を受けた内容でして・・・。
    ハードウェアなども作ってらしくそこらへんやサーバー関係の仕組みには自信があるそうで、
    こちらの意見には聞く耳持たずと言った技術者でした。

    Zendの開発者とも協力してるとかそんなような事も言ってましたね。
    まぁ相手の話を聞いてたら全然信じられませんが。

    色々ありがとうございました。
  • id:satoruyoshida
    Zend Framework のコミッタとして4月ごろまで活動していました(4月以降徐々に休眠中)

    大変気になる記述ですので、あえてコメントいたしますが、

    Zend Framework の前提条件については下記をご覧下さい。
    http://framework.zend.com/manual/en/requirements.introduction.html

    (下記の日本語訳は本日の時点では英語と同期が取れています)
    http://framework.zend.com/manual/ja/requirements.introduction.html

    Zend Core は必須条件ではなく、また、 メモリ領域や internals2.ze1.zendapi.php に関する話の根拠も非常に疑わしく思います。

    本当に協力しているならば、Zendの開発者の名前を質問してみてはいかがでしょうか?

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません