0

質問の背景

私は、 moodle CMSで使用されている *.php ファイルをブラウズしています。Moodle は PHP スクリプトを使用して、訪問者に動的に送信される HTML ページのコンテンツを生成します。多くの場合、次のようなことが起こります (「包含カスケード」)。

// file: file1.php
require(file2.php);

// ファイル: file2.php
必要 (file3.php);
必要 (file4.php);

等...

実際、要求された *.php ファイルから開始して、最終的にいくつかの出力を生成するまで、必要な他のファイルのインクルードがかなりカスケードされます。これが非常に理にかなっているとしても、速度/パフォーマンスへの影響が心配です。そのたびに初期化を何度もやり直しているようです。

質問

HTTP プロトコルがステートレス プロトコルであることを知っていると、サーバーに送信される各要求に対して、PHP/CGI コードで行われる可能性のあるすべての初期化を何度も実行する必要があるように思えます。これは有効な/真の仮定ですか?

例: データベースにアクセスする必要があり、この「より安全な」準備ステートメント/サニタイズなどをすべて実行するのに役立ついくつかのオブジェクトを使用して、これを安全に行いたいと考えています。myDatabaseAccessObject.php)。

例に関しては、質問は次のとおりです。HTTP がステートレスであるという性質のために、要求ごとに
セットアップ (つまり解析) の作業が最初からやり直されるのを防ぐ機会がないというのは本当かどうかです。 myDatabaseAccessObject.php?

それとも、PHP はすでに行われた作業をキャッシュする方法を超えていますか? (もしそうなら、透過的な方法で行われる (つまり、スクリプト作成者が何をキャッシュするかを伝えることができる) または隠蔽された方法で行われる場合、php エンジンは、作成者には見えないキャッシングを行いますか?)

何が起こっているかについて完全に間違った認識を持っているのでしょうか、それとも実際に何度も何度も作業が行われているのでしょうか? PHP スクリプトに必要な初期化が複数の後続のリクエスト間で保存されていれば、これを保存できますか?

4

2 に答える 2

1

あなたは完全に正しいです。すべてのデータベース接続とその他の初期化は、PHP スクリプトの実行ごとに行われます。これは、まさに HTTP プロトコルのステートレス性によるものです。

そうは言っても、プロセスをスピードアップする方法があります。あなたのために何かをすることができるPHPセッション処理があります(ただし、接続をキャッシュすることはできません).たとえば、 Smartyには適切なキャッシュおよびコンパイルシステムなどがあります.

于 2013-09-02T08:48:32.750 に答える
1

Well, to kick off: HTTP isn't really stateless anymore. HTTP 1.1 added persistent connections, which, in itself doesn't make it stateful, but doesn't make the protocol entirely stateless as such. If HTTP 1.1 were to be truly state-less, and you would use persistent connections (chunked transfers), you'd curse the protocol for being too slow, so they've worked around it in a way, that's why I've heard HTTP 1.1 being referred to as dirty-stateless. That's the point I was getting at.

では、質問に戻ります。はい、PHP/CGI の標準インストール (fCGI を使用していないことは確かですか?) では、リクエストごとにすべてのコードを解析、コンパイル、実行する必要があります。それほど大したことではありませんが、それでもオーバーヘッドです。
実際には、2 つのリクエストの間で状態を保持することはできません。static考えてみれば、これが多くの人がPHP でこのキーワードを無意味だと考える理由ですが、それは別の問題です。

あなたの質問は、データベース接続に焦点を当てています。永続的な DB 接続を使用することができ、PHP は接続プールから次の接続を取得する可能性があります。しかし、それは危険で面倒なことであり、事故が起こるのを待っています。
あなたの場合、DB への接続が主要なボトルネックになることはほとんどありません。あなたはmoodleを使用しているので、それは過剰なI / O操作になると思います(あなたが話すrequire-cascade)。

これは、スクリプトのコンパイル時に PHP が生成する実際のバイトコードをキャッシュすることで、非常に簡単に回避できます。APCを調べてください。知る限り、これは使用されている最も人気のあるキャッシュ拡張機能です。何がキャッシュされるか、いつ、どのようにキャッシュされるかを制御できます...
エッジで生活するのが好きで、重要なことに取り組んでいない場合は、次の場合にどれだけパフォーマンスが向上するかを確認することもできますコードを実行可能ファイルにコンパイルする

于 2013-09-02T08:49:12.383 に答える