看了很多文档,总算是把SAE环境给弄起来了,不过SAE提供的本地环境还是不能友好的运行起来,于是放弃了SAE本地环境,就用自己搭建的Apache环境来运行,再兼容SAE云平台。
获取YII-SAE包:
http://yiisae.sinaapp.com/
或:
http://download.youkuaiyun.com/detail/lsg9012/8392375 (含demo)
建立一个新项目,将demo中配置文件复制过来,需要对原demo 下的 config/main.php 做点更改,将 assetsAction 设置为 'index/assets' ,因为我按原方式导致了使用zii中的Jui时生成的静态资源链接访问不到,后面会提到
//如果是SAE环境下
if(defined('SAE_TMP_PATH'))
{
//SAE 禁止本地 I/O
$config['runtimePath'] = SAE_TMP_PATH;
//class使用SAEDbConnection
$config['components']['db'] = array(
'class'=>'SAEDbConnection',
'charset' => 'utf8',
'emulatePrepare' => true,
'enableProfiling'=>true,
'enableParamLogging'=>true,
//cache
'schemaCachingDuration'=>0,
);
//index为控制器(defaultController指定),assets为方法
$config['components']['assetManager'] = array('class' => 'SAEAssetManager','assetsAction'=>'index/assets');
//缓存
$config['components']['cache'] = array(
'class'=> 'SAEMemCache',
'servers'=>array(
array('host'=>'localhost', 'port'=>11211, 'weight'=>100),
),
);
}
在 defaultController 对应的控制器里添加
public function actions()
{
return array(
'assets'=>array(
'class'=>'SAEAssetsAction',
),
);
}
如果是默认的配置情况下我在一个视图文件中使用了下面这一段代码(Yii扩展)时,则会找不到 ZII 下的静态资源
$this->widget('zii.widgets.jui.CJuiDatePicker', array(
'name'=>'pub_date',
'language'=>'zh_cn',
'options'=>array(
'showAnim'=>'fold',
'dateFormat' => 'yy-mm-dd',
),
'htmlOptions'=>array(
"id" => "datepicker",
"class" => "form-control",
),
));
上面的代码生成一个Input框可以选择时间,但是会因找不到静态资源而没有产生效果
<!-- Yii扩展生成的资源链接访问是这样的 -->
http://sinaappName.sinaapp.com/site/assets?path=yiisae/framework/web/js/source/jui/js/jquery-ui.min.js
<!-- 实际使用到的访问是这样的(默认的控制器是site,现在用的是index) -->
http://sinaappName.sinaapp.com/index/assets?path=yiisae/framework/web/js/source/jui/js/jquery-ui.min.js
将 config/main.php 文件中 添加一条兼容SAE上的rules
if(defined('SAE_TMP_PATH'))
{
//设置SAE上的assets
$config['components']['urlManager']['rules']['assets/<path:.*?>'] = 'index/';
}
另外在 SAEAssetsAction 中将如下的判断前加一个 isset, 避免出现未定义的情况,也可以在入口文件中设置屏蔽Notice
if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == $etag)
{
#header('HTTP/1.1 304 Not Modified');
header('Etag:'.$etag,true,304);
}
这样就修改完成了,Yii扩展可以使用了,如果是将原 assets 文件放在 Storage 上去,那链接是什么样的没试过,
我是直接按上面那样配置了后,就跟平常使用Yii一样开发的。