(转)yii流程,入口文件下的准备工作
yii流程
一 目录文件 |-framework 框架核心库 |--base 底层类库文件夹,包含CApplication(应用类,负责全局的用户请求处理,它管理的应用组件集,将提供特定功能给整个应用程 序),CComponent(组件类,该文件包含了基于组件和事件驱动编程的基础类,从版本1.1.0开始,一个行为的属性(或者它的公共成员变量或它通 过getter和/或setter方法??定义的属性)可以通过组件的访问来调用),CBehavior(行为类,主要负责声明事件和相应事件处理程序的 方法、将对象的行为附加到组件等等),CModel(模型类,为所有的数据模型提供的基类),CModule(是模块和应用程序的基类,主要负责应用组件 和子模块)等等 |--caching 所有缓存方法,其中包含了Memcache缓存,APC缓存,数据缓存,CDummyCache虚拟缓存,CEAcceleratorCache缓存等等各种缓存方法 |--cli YII项目生成脚本 |--collections 用php语言构造传统OO语言的数据存储单元。如:队列,栈,哈希表等等 |--console YII控制台 |--db 数据库操作类 |--gii YII 代码生成器(脚手架),能生成包括模型,控制器,视图等代码 |--i18n YII 多语言,提供了各种语言的本地化数据,信息、文件的翻译服务、本地化日期和时间格式,数字等 |--logging 日志组件,YII提供了灵活和可扩展的日志记录功能。消息记录可分为根据日志级别和信息类别。应用层次和类别过滤器,可进一步选择的消息路由到不同的目的 地,例如文件,电子邮件,浏览器窗口,等等|--messages 提示信息的多语言 |--test YII提供的测试,包括单元测试和功能测试 |--utils 提供了常用的格式化方法 |--validators 提供了各种验证方法 |--vendors 这个文件夹包括第三方由Yii框架使用的资料库 |--views 提供了YII错误、日志、配置文件的多语言视图 |--web YII所有开发应用的方法 |---actions 控制器操作类 |---auth 权限认识类,包括身份认证,访问控制过滤,基本角色的访问控制等 |---filters 过滤器,可被配置在控制器动作执行之前或之后执行。例如, 访问控制过滤器将被执行以确保在执行请求的动作之前用户已通过身份验证;性能过滤器可用于测量控制器执行所用的时间 |---form 表单生成方法 |---helpers 视图助手,包含GOOGLE AJAX API,创建HTML,JSON,JAVASCRIPT相关功能 |---js JS库 |---renderers 视图渲染组件 |---services 封装SoapServer并提供了一个基于WSDL的Web服务 |---widgets 部件 |---CArrayDataProvider.php 可以配置的排序和分页属性自定义排序和分页的行为 |---CActiveDataProvider.php ActiveRecord方法类 |---CController.php 控制器方法,主要负责协调模型和视图之间的交互 |---CPagination.php 分页类 |---CUploadedFile.php 上传文件类 |---CUrlManager.php URL管理 |---CWebModule.php 应用模块管理,应用程序模块可被视为一个独立的子应用 等等方法 |--.htaccess 重定向文件 |--yii.php 引导文件 |--YiiBase.php YiiBase类最主要的功能是注册了自动加载类方法,加载框架要用到所有接口。 |--yiic Yii LINUX 命令行脚本 |--yiic.bat YII WINDOW 命令行脚本 |--yiilite.php 它是一些常用到的 Yii 类文件的合并文件。在文件中,注释和跟踪语句都被去除。因此,使用 yiilite.php 将减少被引用的文件数量并避免执行跟踪语句 二 源码分析 1. 启动 网站的唯一入口程序 index.php : 1. $yii =dirname( __FILE__ ). '/../framework/yii.php' ; 2. $config =dirname( __FILE__ ). '/protected/config/main.php' ; 3. 4. // remove the following line when in production mode 5. defined( 'YII_DEBUG' ) or define( 'YII_DEBUG' ,true); 6. 7. require_once ( $yii ); 8. Yii::createWebApplication( $config )->run(); 上面的 require_once ( $yii ) 引用出了后面要用到的全局类Yii,Yii类是YiiBase类的完全继承: 1. class Yii extends YiiBase 2. { 3. } 系统的全局访问都是通过Yii类(即YiiBase类)来实现的,Yii类的成员和方法都是 static 类型。 2. 类加载 Yii利用PHP5提供的spl库来完成类的自动加载。在YiiBase.php 文件结尾处 1. spl_autoload_register( array ( 'YiiBase' , 'autoload' )); 将YiiBase类的静态方法autoload 注册为类加载器。 PHP autoload 的简单原理就是执行 new 创建对象或通过类名访问静态成员时,系统将类名传递给被注册的类加载器函数,类加载器函数根据类名自行找到对应的类文件并 include 。 下面是YiiBase类的autoload方法: 1. public static function autoload( $className ) 2. { 3. // use include so that the error PHP file may appear 4. if (isset(self:: $_coreClasses [ $className ])) 5. include (YII_PATH.self:: $_coreClasses [ $className ]); 6. else if (isset(self:: $_classes [ $className ])) 7. include (self:: $_classes [ $className ]); 8. else 9. include ( $className . '.php' ); 10. } 可以看到YiiBase的静态成员 $_coreClasses 数组里预先存放着Yii系统自身用到的类对应的文件路径: 1. private static $_coreClasses = array ( 2. 'CApplication' => '/base/CApplication.php' , 3. 'CBehavior' => '/base/CBehavior.php' , 4. 'CComponent' => '/base/CComponent.php' , 5. ... 6. ) 非 coreClasse 的类注册在YiiBase的 $_classes 数组中: private static $_classes = array (); 其他的类需要用Yii::import()讲类路径导入PHP include paths 中,直接 include ( $className . '.php' ) 3. CWebApplication的创建 回到前面的程序入口的 Yii::createWebApplication( $config )->run(); 1. public static function createWebApplication( $config =null) 2. { 3. return new CWebApplication( $config ); 4. } 现在autoload机制开始工作了。 当系统 执行 new CWebApplication() 的时候,会自动 include (YII_PATH. '/base/CApplication.php' ) 将main.php里的配置信息数组 $config 传递给CWebApplication创建出对象,并执行对象的run() 方法启动框架。 CWebApplication类的继承关系 CWebApplication -> CApplication -> CModule -> CComponent $config 先被传递给CApplication的构造函数 1. public function __construct( $config =null) 2. { 3. Yii::setApplication( $this ); 4. 5. // set basePath at early as possible to avoid trouble 6. if ( is_string ( $config )) 7. $config = require ( $config ); 8. if (isset( $config [ 'basePath' ])) 9. { 10. $this ->setBasePath( $config [ 'basePath' ]); 11. unset( $config [ 'basePath' ]); 12. } 13. else 14. $this ->setBasePath( 'protected' ); 15. Yii::setPathOfAlias( 'application' , $this ->getBasePath()); 16. Yii::setPathOfAlias( 'webroot' ,dirname( $_SERVER [ 'SCRIPT_FILENAME' ])); 17. 18. $this ->preinit(); 19. 20. $this ->initSystemHandlers(); 21. $this ->registerCoreComponents(); 22. 23. $this ->configure( $config ); 24. $this ->attachBehaviors( $this ->behaviors); 25. $this ->preloadComponents(); 26. 27. $this ->init(); 28. } Yii::setApplication( $this ); 将自身的实例对象赋给Yii的静态成员 $_app ,以后可以通过 Yii::app() 来取得。 后面一段是设置CApplication 对象的_basePath ,指向 proteced 目录。 1. Yii::setPathOfAlias( 'application' , $this ->getBasePath()); 2. Yii::setPathOfAlias( 'webroot' ,dirname( $_SERVER [ 'SCRIPT_FILENAME' ])); 设置了两个系统路径别名 application 和 webroot,后面再import的时候可以用别名来代替实际的完整路径。别名配置存放在YiiBase的 $_aliases 数组中。 $this ->preinit(); 预初始化。preinit()是在 CModule 类里定义的,没有任何动作。 $this ->initSystemHandlers() 方法内容: 1. /** 2. * Initializes the class autoloader and error handlers. 3. */ 4. protected function initSystemHandlers() 5. { 6. if (YII_ENABLE_EXCEPTION_HANDLER) 7. set_exception_handler( array ( $this , 'handleException' )); 8. if (YII_ENABLE_ERROR_HANDLER) 9. set_error_handler( array ( $this , 'handleError' ), error_reporting ()); 10. } 设置系统exception_handler和 error_handler,指向对象自身提供的两个方法。 4. 注册核心组件 $this ->registerCoreComponents(); 代码如下: 1. protected function registerCoreComponents() 2. { 3. parent::registerCoreComponents(); 4. 5. $components = array ( 6. 'urlManager' => array ( 7. 'class' => 'CUrlManager' , 8. ), 9. 'request' => array ( 10. 'class' => 'CHttpRequest' , 11. ), 12. 'session' => array ( 13. 'class' => 'CHttpSession' , 14. ), 15. 'assetManager' => array ( 16. 'class' => 'CAssetManager' , 17. ), 18. 'user' => array ( 19. 'class' => 'CWebUser' , 20. ), 21. 'themeManager' => array ( 22. 'class' => 'CThemeManager' , 23. ), 24. 'authManager' => array ( 25. 'class' => 'CPhpAuthManager' , 26. ), 27. 'clientScript' => array ( 28. 'class' => 'CClientScript' , 29. ), 30. ); 31. 32. $this ->setComponents( $components ); 33. } 注册了几个系统组件(Components)。 Components 是在 CModule 里定义和管理的,主要包括两个数组 1. private $_components = array (); 2. private $_componentConfig = array (); 每个 Component 都是 IApplicationComponent接口的实例,Componemt的实例存放在 $_components 数组里,相关的配置信息存放在 $_componentConfig 数组里。配置信息包括Component 的类名和属性设置。 CWebApplication 对象注册了以下几个Component:urlManager, request,session,assetManager,user,themeManager,authManager,clientScript。 CWebApplication的parent 注册了以下几个 Component:coreMessages,db,messages,errorHandler,securityManager,statePersister。 Component 在YiiPHP里是个非常重要的东西,它的特征是可以通过 CModule 的 __get() 和 __set() 方法来访问。 Component 注册的时候并不会创建对象实例,而是在程序里被第一次访问到的时候,由CModule 来负责(实际上就是 Yii::app())创建。 5. 处理 $config 配置 继续, $this ->configure( $config ); configure() 还是在CModule 里: 1. public function configure( $config ) 2. { 3. if ( is_array ( $config )) 4. { 5. foreach ( $config as $key => $value ) 6. $this -> $key = $value ; 7. } 8. } 实际上是把 $config 数组里的每一项传给 CModule 的 父类 CComponent __set() 方法。 1. public function __set( $name , $value ) 2. { 3. $setter = 'set' . $name ; 4. if (method_exists( $this , $setter )) 5. $this -> $setter ( $value ); 6. else if ( strncasecmp ( $name , 'on' ,2)===0 7. && method_exists( $this , $name )) 8. { 9. //duplicating getEventHandlers() here for performance 10. $name = strtolower ( $name ); 11. if (!isset( $this ->_e[ $name ])) 12. $this ->_e[ $name ]= new CList; 13. $this ->_e[ $name ]->add( $value ); 14. } 15. else if (method_exists( $this , 'get' . $name )) 16. throw new CException(Yii::t( 'yii' , 'Property "{class}.{property}" is read only.' , 17. array ( '{class}' =>get_class( $this ), '{property}' => $name ))); 18. else 19. throw new CException(Yii::t( 'yii' , 'Property "{class}.{property}" is not defined.' , 20. array ( '{class}' =>get_class( $this ), '{property}' => $name ))); 21. } 22. } 我们来看看: if (method_exists( $this , $setter )) 根据这个条件, $config 数组里的basePath, params, modules, import, components 都被传递给相应的 setBasePath(), setParams() 等方法里进行处理。 6、 $config 之 import 其中 import 被传递给 CModule 的 setImport: 1. public function setImport( $aliases ) 2. { 3. foreach ( $aliases as $alias ) 4. Yii::import( $alias ); 5. } Yii::import( $alias )里的处理: 1. public static function import( $alias , $forceInclude =false) 2. { 3. // 先判断$alias是否存在于YiiBase::$_imports[] 中,已存在的直接return, 避免重复import。 4. if (isset(self:: $_imports [ $alias ])) // previously imported 5. return self:: $_imports [ $alias ]; 6. 7. // $alias类已定义,记入$_imports[],直接返回 8. if ( class_exists ( $alias ,false)) 9. return self:: $_imports [ $alias ]= $alias ; 10. 11. // 类似 urlManager 这样的已定义于$_coreClasses[]的类,或不含.的直接类名,记入$_imports[],直接返回 12. if (isset(self:: $_coreClasses [ $alias ]) || ( $pos = strrpos ( $alias , '.' ))===false) // a simple class name 13. { 14. self:: $_imports [ $alias ]= $alias ; 15. if ( $forceInclude ) 16. { 17. if (isset(self:: $_coreClasses [ $alias ])) // a core class 18. require (YII_PATH.self:: $_coreClasses [ $alias ]); 19. else 20. require ( $alias . '.php' ); 21. } 22. return $alias ; 23. } 24. 25. // 产生一个变量 $className,为$alias最后一个.后面的部分 26. // 这样的:'x.y.ClassNamer' 27. // $className不等于 '*', 并且ClassNamer类已定义的, ClassNamer' 记入 $_imports[],直接返回 28. if (( $className =(string) substr ( $alias , $pos +1))!== '*' && class_exists ( $className ,false)) 29. return self:: $_imports [ $alias ]= $className ; 30. 31. // 取得 $alias 里真实的路径部分并且路径有效 32. if (( $path =self::getPathOfAlias( $alias ))!==false) 33. { 34. // $className!=='*',$className 记入 $_imports[] 35. if ( $className !== '*' ) 36. { 37. self:: $_imports [ $alias ]= $className ; 38. if ( $forceInclude ) 39. require ( $path . '.php' ); 40. else 41. self:: $_classes [ $className ]= $path . '.php' ; 42. return $className ; 43. } 44. // $alias是'system.web.*'这样的已*结尾的路径,将路径加到include_path中 45. else // a directory 46. { 47. set_include_path(get_include_path().PATH_SEPARATOR. $path ); 48. return self:: $_imports [ $alias ]= $path ; 49. } 50. } 51. else 52. throw new CException(Yii::t( 'yii' , 'Alias "{alias}" is invalid. Make sure it points to an existing directory or file.' , 53. array ( '{alias}' => $alias ))); 54. } 7. $config 之 components $config 数组里的 $components 被传递给CModule 的setComponents( $components ) 1. public function setComponents( $components ) 2. { 3. foreach ( $components as $id => $component ) 4. { 5. if ( $component instanceof IApplicationComponent) 6. $this ->setComponent( $id , $component ); 7. else if (isset( $this ->_componentConfig[ $id ])) 8. $this ->_componentConfig[ $id ]=CMap::mergeArray( $this ->_componentConfig[ $id ], $component ); 9. else 10. $this ->_componentConfig[ $id ]= $component ; 11. } 12. } $componen 是IApplicationComponen的实例的时候,直接赋值: $this ->setComponent( $id , $component ), 1. public function setComponent( $id , $component ) 2. { 3. $this ->_components[ $id ]= $component ; 4. if (! $component ->getIsInitialized()) 5. $component ->init(); 6. } 如果 $id 已存在于_componentConfig[]中(前面注册的coreComponent),将 $component 属性加进入。 其他的component将component属性存入_componentConfig[]中。 8. $config 之 params 这个很简单 1. public function setParams( $value ) 2. { 3. $params = $this ->getParams(); 4. foreach ( $value as $k => $v ) 5. $params ->add( $k , $v ); 6. } configure 完毕! 9. attachBehaviors $this ->attachBehaviors( $this ->behaviors); 空的,没动作 预创建组件对象 1. $this ->preloadComponents(); 2. 3. protected function preloadComponents() 4. { 5. foreach ( $this ->preload as $id ) 6. $this ->getComponent( $id ); 7. } getComponent() 判断_components[] 数组里是否有 $id 的实例,如果没有,就根据_componentConfig[ $id ]里的配置来创建组件对象,调用组件的init()方法,然后存入_components[ $id ]中。 10. init() $this ->init(); 函数内: $this ->getRequest(); 创建了Reques 组件并初始化。 11. run() 1. public function run() 2. { 3. $this ->onBeginRequest( new CEvent( $this )); 4. $this ->processRequest(); 5. $this ->onEndRequest( new CEvent( $this )); 6. } 三 大概过程 application构造函数: 1 设置当前运行实例 2 获取配置参数 3 设置basepath 4 设置几个path;application,webroot ,ext 5 preinit 6 注册error、exception处理函数 initSystemHandlers 7 加载核心组件 registerCoreComponents 包括webapplication的和application的 8 设置配置文件 configure( $config ) 9 附加行为 $this ->attachBehaviors( $this ->behaviors); 10处理加载config中的preload, //通过getComponent分别加载并初始化 $this->preloadComponents(); 11 初始化init(); //加载CHttpRequest组件 run: 1 处理onBeginRequest 2 processRequest();真正处理请求 3 处理onEndRequest webapplication->processRequest(): 1 如果配置文件设置了catchAllRequest , // 'catchAllRequest'=>array('site/error','p1'=>'1','p2'=>'2'), 则所有请求都跳转到这个controller/action这个route,并且设置 $_GET 参数。 2 分析url得到route,便于后面的控制器/动作创建 3 执行runController runController: 1 创建controller, createController(),创建失败,则抛出404错误 2 得到controller对象和actionID 3 控制器初始化 $controller ->init(); 4 最后执行 $controller ->run( $actionID ); //真正执行页面请求 控制器类 CController:默认控制器在CWebApplication::defaultController定义( 'site' ),可以在配置文件修改 run(): 1 //根据actionID创建action对象,这里生成的action对象分为定义在controller内联动作和自定义action,比如CViewAction $action = $this ->createAction( $actionID ),如果创建动作失败,missingAction抛出404错误 2 beforeControllerAction(beforeControllerAction定义在CWebApplication,有时也在module里面)为真,才执行runActionWithFilters; 3 afterControllerAction runActionWithFilters( $action , $this ->filters()): 1 //如果过滤器为空,直接运行runAction() 2 执行过滤器链 runAction(): 1 beforeAction()返回真,才执行 2 执行 $action ->runWithParams();注意:这里存在多态,每个action都可以实现这个方法, 因为CInlineAction自己实现了runWithParams() 3 第2步骤为真,才执行afterAction( $action ); 动作类 默认动作在CController:: $defaultAction 定义( 'index' ),可以在CController的继承类重新定义 runWithParams(): 1 分为2种情况,1种是内联动作,1种是通过控制器的actions方法定义的外联动作。 2 内联动作 通过action+动作id作为动作处理函数 3 外联动作 通过调用run()函数来实现 4 如果动作方法参数个数大于0,执行runWithParamsInternal,否则直接执行动作方法。 runWithParamsInternal(); 1 根据反射的方法对象得到方法的形参列表,从 控制器对象->getActionParams()得到实参, 如果实参有形参要求的参数,取其值,不然取形参默认值,否则,出错。 2 调用动作方法 2种形式 1是action+动作id ,2是Caction的派生类(比如cviewaction)的run() 3 执行控制器的CController->render方法; $controller ->render( $view ) 控制器类 CController: render(); 1 renderPartial();得到视图, //先得到contact页面的view文件内容,注意是用include的形式,所以其中的$this是指siteControlerd对象, 这里调用了renderFile(); 2 然后 $output = $this ->renderFile( $layoutFile , array ( 'content' => $output ),true) 把view中的内容插入到布局页面layouts的column1.php, 'content' 和layout的页面的 $content 变量相关 renderFile(); 1 如果程序没有定义viewrender,则执行controller->renderInternal();否则,执行 $renderer =Yii::app()->getViewRenderer())->renderFile(); |
发生404错误
errorHandler 在配置文件main中,
'errorAction'
=>
'site/error'
,
**********************************************************
runActionWithFilters
过滤:
CFilterChain(继承CList,提供数字索引存取功能,遍历)::create(
$this
,
$action
,
$filters
)->run();
首先创建过滤链,然后执行过滤
CFilterChain::create(
$controller
,
$action
,
$filters
):
1
$chain
=
new
CFilterChain(
$controller
,
$action
);创建一个过滤链
$chain
2 根据参数filters数组,遍历创建过滤器
$filter
(字符串:通过CInlineFilter::create或者 数组:Yii::createComponent),
并且初始化
$filter
::init,通过
$chain
->add(
$filter
)添加到过滤链中,并且返回这个过滤链
$chain
注意:如果是字符串,控制器类controller必须要有
"filter"
+过滤器名的方法。
$chain
::run();
1 如果数字索引合法,得到
$filter
,然后执行
$filter
->filter(
$this
);
1.1
$filter
->filter(
$this
):
1 执行动作的
'filter'
+过滤器名称的方法。
//比如CController::filterAccessControl($filterChain);
1.1.1 CController::filterAccessControl(
$filterChain
):
1
$filter
=
new
CAccessControlFilter;
//新建过滤器
2
$filter
->setRules(
$this
->accessRules());
//设置规则
3
$filter
->filter(
$filterChain
) ;
//执行过滤
4
$filter
->preFilter(
$filterChain
)为真,继续执行
$filterChain
->run();
5
$filter
->postFilter(
$filterChain
);
//这个是在动作执行之后过滤
2 否则,说明过滤完毕,
$this
->controller->runAction(
$this
->action); 直接执行动作。
(转)yii流程,入口文件下的准备工作的更多相关文章
- yii的入口文件index.php中为什么会有这两句
yii的应用模板中,index.php中 前面会有这两句 <?php // comment out the following two lines when deployed to produc ...
- 更改yii框架入口文件位置,修改前后端访问路径
将frontend/web/index.php复制到项目根目录,修改为: <?php defined('YII_DEBUG') or define('YII_DEBUG', true); def ...
- Yii2 源码分析 入口文件执行流程
Yii2 源码分析 入口文件执行流程 1. 入口文件:web/index.php,第12行.(new yii\web\Application($config)->run()) 入口文件主要做4 ...
- PHPStudy+PHPStorm下配置隐藏项目入口文件
img { max-width: 100% } 默认情况下项目入口文件是站点根目录下index.php文件,一般程序启动时通过这个文件,定义文件路径,配置重要节点(比如是否开启调试模式),注册路由等, ...
- ubuntu-apache下隐藏thinkphp入口文件index.php
按照thinkphp手册中来讲,apache服务器下,隐藏thinkphp入口文件有3步: httpd.conf配置文件中加载了mod_rewrite.so模块 AllowOverride None ...
- nginx下TP5 隐藏入口文件+支持pathinfo模式+配置多项目根目录
首先说下项目目录情况 跟目录/usr/share/nginx/html/(别说怎么这么深 0.0) html文件夹下面两个目录 pssh pssh_shop 两个tp5项目分别对应两个二级域名 ...
- Ubuntu下TP5隐藏入口文件
部分内容是复制其他网友的博文,由于过了一段时间,找不到原文地址,再次表示感谢.以下是自己整理的,目的只是以后方便查阅 1.ubuntu或linux下找不到apache服务器配置文件httpd.conf ...
- Nginx 虚拟主机下支持Pathinfo并隐藏入口文件的完整配置
server { listen 80; server_name zuqiu.com; # 设置你的域名 index index.html index.htm index.php; root D:/wn ...
- MVC 模型、视图、控制及其单入口文件的mvc的工作原理
什么是mvc,mvc就是模型视图控制,模型就是model,在项目中负责数据库相关的操作,视图就是view ,负责页面的展示和数据的展示,控制就是controller ,负责中间的逻辑转换,数 ...
随机推荐
- Myeclipse10下载,安装,破解,插件,优化介绍
一.Myeclipse10下载与破解 Genuitec 公司发布了MyEclipse 10,一款Genuitec旗下的商业化Eclipse集成开发工具的升级版本.MyEclipse 10基于Eclip ...
- Lucene.net站内搜索—5、搜索引擎第一版实现
目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...
- adb 常用命令总结
1. adb / adb -help 使用帮助 2. adb devices 查看连接到电脑的设备 3. adb install example.apk 安装程序 4. adb -s emulator ...
- 高效 Java Web 开发框架 JessMA v3.3.1 Beta-1 发布
JessMA(原名:Portal-Basic)是一套功能完备的高性能 Full-Stack Web 应用开发框架,内置可扩展的 MVC Web 基础架构和 DAO 数据库访问组件(内部已提供了 Hib ...
- nginx 在ubuntu 上的启动,停止,重启
vi 显示行号 :set num 在开始玩nginx之前,得先安装nginx,可以参考 <ubuntu15.10_x64 安装 nginx> 启动 sudo /usr/local/ng ...
- ScrollMagic – 酷毙了!超炫的页面滚动交互效果
ScrollMagic 是一款 jQuery 插件,它让你可以像使用进度条一样使用滚动条.如果你想在特定的滚动位置开始一个动画,并且让动画同步滚动条的动作,或者把元素粘在一个特定的滚动位置,那么这款插 ...
- html4基础知识梳理
基础的html知识,只放Xmind的截图. 第一部分: 第二部分: 某些标签的使用示例及注意事项,在印象笔记里.
- HTML <fieldset> 标签将表单内的相关元素分组
<fieldset> 标签将表单内容的一部分打包,生成一组相关表单的字段. 当一组表单元素放到 <fieldset> 标签内时,浏览器会以特殊方式来显示它们,它们可能有特殊的边 ...
- 用SVG绕过浏览器XSS审计
[Translated From]:http://insert-script.blogspot.com/2014/02/svg-fun-time-firefox-svg-vector.html === ...
- mysql innodb 奔溃问题
ps -A | grep -i mysql kill 列出来的进程 service mysql start 我的问题就解决了 ------------------------------------- ...