是的,Yii 支持这一点。事实上,这就是我对一些网站的配置方式。
(当然,这是基于将所有站点都放在同一服务器上。但我看到埃文有这个。这不适用于跨服务器。)
Firstly,这需要您将代码从 Web 根目录移到文档根目录中。看here http://www.yiiframework.com/wiki/116/moving-project-code-outside-of-webroot-plus-multiple-project-support/.
Secondly,它要求您使用 Yii AssetsBase。看here http://www.yiiframework.com/wiki/148/understanding-assets/ and there http://www.yiiframework.com/wiki/311/assetmanager-clearing-browser-s-cache-on-site-update/。我发现资产管理配置起来很困难(但使用起来很轻松)。这就是我最终得到的结果:
在 Components/Controller.php 中包含以下内容:
/**
* @var registers which js, css, images have been published
* See: http://www.yiiframework.com/wiki/311/assetmanager-clearing-browser-s-cache-on-site- update/
*/
private $_assetsBase;
public function getAssetsBase()
{
if ($this->_assetsBase === null) {
Yii::app()->assetManager->newDirMode = 0755;
Yii::app()->assetManager->newFileMode = 0644;
$this->_assetsBase = Yii::app()->assetManager->publish(
Yii::getPathOfAlias('application.assets'),
false,
-1,
defined('YII_DEBUG') && YII_DEBUG
);
}
return $this->_assetsBase;
}
上面假设你的JS、CSS和图片的位置如下:
protected/assets/js/mobiscroll-2.3.custom.min.js
protected/assets/css/mobiscroll-2.3.custom.min.css
protected/assets/img/einstein.png
然后在您的视图中,按如下方式调用您的资产:
<?php
$cs->registerScriptFile($this->assetsBase.'/js/mobiscroll-2.3.1/js/mobiscroll-2.3.custom.min.js');
$cs->registerCssFile($this->assetsBase.'/js/mobiscroll-2.3.1/css/mobiscroll-2.3.custom.min.css');
?>
<img src="<?php echo $this->assetsBase ?>/img/einstein.png">
最后,在对 JS 或 CSS 进行更改后,您将希望在所有用户的浏览器中强制刷新缓存。您可以通过触摸(原始)资产目录来完成此操作。这将迫使 Yii 重新哈希(已发布的)资产目录。随后,您的 JS 和 CSS 将在所有用户的浏览器中刷新。做这样的事情:
$command = 'touch /path/to/your/website/protected/assets';
exec ( $command.' 2>&1', $output , $result );
if ($result === 0) {
$message = 'Assets have been pointed; a new directory should now be hashed';
} else {
$message = 'Looks like something went wrong. Assets not pointed?';
} // END if