我是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
插件/ webroot / asset中的文件是否需要由PHP读取然后插入HTML而不是由服务器本身直接提供,因为真的不是http模块可以访问的webroot目录?
手册说软链接会加快这个过程。 cakephp首先查看/ app / webroot / asset然后调用调度程序在plugin / webroot / asset中找到它并读取并提供服务吗?
或者该文件的查找/读取方式相同,但是如果资产不在app / webroot / asset位置,则必须使用调度程序来查找资产?
答案 0 :(得分: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>
- 因为网络服务器应该自己这样做。
如果请求是针对webroot中存在 not 的文件,那么事情要慢得多,因为很简单,涉及的流程更多。甚至像这样的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项目可以直接通过网络访问的唯一路径是'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延迟!)