1

私はcakephpが初めてで、マニュアルでこれを見つけました:

PHP を介してアセットを提供すると、PHP を呼び出さずにそれらのアセットを提供する場合よりも遅くなることが保証されていることは、よく知られている事実です。また、コア チームは、プラグインとテーマ アセットを可能な限り高速に提供するための措置を講じていますが、より高いパフォーマンスが必要になる場合もあります。このような状況では、CakePHP で使用されるものと一致するパスを持つ app/webroot 内のディレクトリに、プラグイン/テーマ アセットをシンボリック リンクするかコピー アウトすることをお勧めします。

app/Plugin/DebugKit/webroot/js/my_file.js 
   becomes app/webroot/debug_kit/js/my_file.js
app/View/Themed/Navy/webroot/css/navy.css 
   becomes app/webroot/theme/Navy/css/navy.css

plugin/webroot/asset 内のファイルは、実際には http モジュールからアクセスできる webroot ディレクトリではないため、サーバー自体によって直接提供されるのではなく、PHP によって読み取られてから HTML に挿入される必要がありますか?

マニュアルには、ソフトリンクがこのプロセスを高速化すると書かれています。Cakephp は最初に /app/webroot/asset を調べてから、ディスパッチャーを呼び出して plugin/webroot/asset で検索し、それを読み取って提供しますか?

または、app/webroot/asset の場所にない場合、cake がアセットを見つけるためにディスパッチャーを使用する必要があることを除いて、ファイルの検索/読み取り方法はプロセスと同じですか?

4

1 に答える 1

1

ファイルを提供するため...

ウェブサーバーは最速です

デフォルトの書き換え規則は次のとおりです。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

つまり、リクエストがウェブサーバーが見ることができるファイルに対するものである場合は、php に話しかけずに、ファイルの内容 (または適切なヘッダー) で応答するだけです。この状況では、「cakephp は最初に /app/webroot/asset ... を調べますか?」というメッセージはありません。これは、リクエストの処理に CakePHP (または PHP) が関与していないためです。

つまり、簡単に言えば次のとおりです。

Request 
-> webserver 
  -> check if file exists
    -> response (file contents)

別の Web サーバー (Apache ではない) が使用されている場合、CakePHP は同等の書き換えルールを期待します。相当するものが存在するかどうかは決してチェックしませんapp/webroot/<the current url>-Webサーバーがそれ自体を行う必要があるためです。

PHPが遅い

要求が webroot に存在しないファイルに対するものである場合、処理が大幅に遅くなります。次のようなphpスクリプトでも:

<?php
// example app/webroot/index.php
$path = 'server/this/file.html';
echo file_get_contents($path);
exit;

次のように、ウェブサーバーによって直接処理される同等のリクエストよりも遅くなります。

Request 
-> webserver 
  -> check if file exists
    -> invoke php 
      -> get file contents 
    -> respond to webserver 
  -> response

さらに、phpはファイルを提供するために特別に設計されていないため(Webサーバーがそうであるか、そうあるべきであるように)、Webサーバー単独よりも本質的に遅くなります。

CakePHP は遅い

CakePHP プロジェクトで Web から直接アクセスできる唯一のパスは「app/webroot」です。

CakePHP によって処理されるリクエストの場合、Asset ディスパッチ フィルター(スリム化されたディスパッチ プロセス) を使用しても、明らかにより多くのロジックが関与するため、php でファイルをサーバーするために必要な最小限のロジックよりも遅くなります。簡単に言うと、リクエストは次のようになります。

Request 
-> webserver 
  -> check if file exists
    -> invoke php 
      -> Bootstrap CakePHP
      -> Dispatch Request
        -> Check Dispatch filters
          -> check if request matches a configured plugin/theme file path
            -> check if file exists
          -> generate response
        -> output response
    -> respond to webserver 
  -> response

静的ファイルの要求を Web サーバーに処理させる場合と比べて、パフォーマンスの違いは非常に大きくなる可能性があります

結論

必要のないときに php でファイルを提供することは、リソースの浪費です。可能な限り、リクエストの上位 (Web サーバー、プロキシ、またはできればユーザー自身のブラウザー キャッシュ) からの応答を許可する必要があります (~0 レイテンシー!)。

于 2013-07-18T21:56:24.800 に答える