【问题标题】:cakephp asset management speedcakephp资产管理速度
【发布时间】:2013-07-17 23:05:33
【问题描述】:

我是 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

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

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

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

【问题讨论】:

    标签: cakephp plugins themes dispatch


    【解决方案1】:

    用于提供文件...

    网络服务器速度最快

    default rewrite rules如下:

    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 项目唯一可直接通过 Web 访问的路径是 ´app/webroot`。

    对于由 CakePHP 处理的请求,即使使用 Asset dispatch filter(这是一个精简的调度过程) - 显然涉及的逻辑更多,因此它比使用 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
    

    与让网络服务器处理对静态文件can be very significant 的请求相比,性能上的差异。

    结论

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

    【讨论】:

      猜你喜欢
      • 2015-10-01
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 2017-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多