对于提供文件...
网络服务器最快
默认重写规则如下:
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 延迟!)。