1

我是 cakephp 新手,我在手册中找到了这个:

众所周知,通过 PHP 提供资产肯定比不调用 PHP 提供这些资产要慢。虽然核心团队已采取措施使插件和主题资产尽快服务,但可能存在需要更高性能的情况。在这些情况下,建议您使用符号链接或将插件/主题资产复制到 app/webroot 中的目录,其路径与 CakePHP 使用的路径匹配。

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

是否需要 PHP 读取 plugin/webroot/asset 中的文件,然后将其插入 HTML,而不是直接由服务器本身提供服务,因为确实不是 http 模块可以访问的 webroot 目录?

手册说软链接会加快这个过程。cakephp 是否首先在 /app/webroot/asset 中查找,然后调用调度程序在 plugin/webroot/asset 中找到它并读取它并提供它?

或者文件的查找/读取过程是否相同,除了如果它不在 app/webroot/asset 位置,蛋糕必须使用调度程序来定位资产?

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)

如果正在使用不同的网络服务器(不是 apache),CakePHP 需要等效的重写规则。它永远不会检查等价物是否app/webroot/<the current url>存在——因为网络服务器应该自己做。

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 并不是专门为提供文件而设计的(就像网络服务器是或应该是),因此在这样做时本质上比单独的网络服务器要慢。

CakePHP 比较慢

CakePHP 项目唯一可以直接通过网络访问的路径是“app/webroot”。

对于 CakePHP 处理的请求,即使使用资产调度过滤器(这是一个精简的调度过程)——显然涉及更多的逻辑,因此它比使用 php.ini 提供文件所需的最低限度逻辑要慢。简而言之,请求变为:

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

与让网络服务器处理静态文件请求相比,性能上的差异可能非常显着

结论

在没有必要时使用 php 提供文件是一种资源浪费,如果可能的话,允许响应来自更高的请求 - 网络服务器、代理或最好是用户自己的浏览器缓存(~0 延迟!)。

于 2013-07-18T21:56:24.800 回答