- 浏览: 339797 次
- 性别:
- 来自: 北京
博客专栏
-
高性能PHP框架Yii分析...
浏览量:85092
文章分类
最新评论
-
huxiaoyunhust:
价值观这种东西,说不好听是口号,其实是公司每天潜移默化的感染, ...
关于企业价值观的一点点感悟 -
silentime:
stef831018 写道你想多了,企业价值观就两个字:利益怎 ...
关于企业价值观的一点点感悟 -
stef831018:
你想多了,企业价值观就两个字:利益
关于企业价值观的一点点感悟 -
guoyuqiangf8:
关于企业价值观的一点点感悟 -
silentime:
mangguo 写道推荐大家去看看我写的python入门,可以 ...
python如何打印变量的类型
然后调用了两个初始化异常/错误和注册核心组件的方法:
$this->initSystemHandlers(); $this->registerCoreComponents();
函数实现如下:
//初始化errorhandler和exceptionhandler protected function initSystemHandlers() { if(YII_ENABLE_EXCEPTION_HANDLER) set_exception_handler(array($this,'handleException')); if(YII_ENABLE_ERROR_HANDLER) set_error_handler(array($this,'handleError'),error_reporting()); }
registerCoreComponents调用了CWebApplication的方法:
protected function registerCoreComponents() { parent::registerCoreComponents(); $components=array( //url路由类 'urlManager'=>array( 'class'=>'CUrlManager', ), //http请求处理类 'request'=>array( 'class'=>'CHttpRequest', ), //session 处理类 'session'=>array( 'class'=>'CHttpSession', ), //assets文件管理类 'assetManager'=>array( 'class'=>'CAssetManager', ), //用户类 'user'=>array( 'class'=>'CWebUser', ), //主题管理类 'themeManager'=>array( 'class'=>'CThemeManager', ), //认证管理类 'authManager'=>array( 'class'=>'CPhpAuthManager', ), //客户端脚本管理类 'clientScript'=>array( 'class'=>'CClientScript', ), ); $this->setComponents($components); }
其中CWebApplication的parent中代码如下:
protected function registerCoreComponents() { $components=array( //消息类(国际化) 'coreMessages'=>array( 'class'=>'CPhpMessageSource', 'language'=>'en_us', 'basePath'=>YII_PATH.DIRECTORY_SEPARATOR.'messages', ), //数据库类 'db'=>array( 'class'=>'CDbConnection', ), 'messages'=>array( 'class'=>'CPhpMessageSource', ), //错误处理 'errorHandler'=>array( 'class'=>'CErrorHandler', ), //安全处理类 'securityManager'=>array( 'class'=>'CSecurityManager', ), //基于文件的持久化存储类 'statePersister'=>array( 'class'=>'CStatePersister', ), ); $this->setComponents($components); }
setComponents定义在CModule中:
/** * Sets the application components. * * When a configuration is used to specify a component, it should consist of * the component's initial property values (name-value pairs). Additionally, * a component can be enabled (default) or disabled by specifying the 'enabled' value * in the configuration. * * If a configuration is specified with an ID that is the same as an existing * component or configuration, the existing one will be replaced silently. * * The following is the configuration for two components: * <pre> * array( * 'db'=>array( * 'class'=>'CDbConnection', * 'connectionString'=>'sqlite:path/to/file.db', * ), * 'cache'=>array( * 'class'=>'CDbCache', * 'connectionID'=>'db', * 'enabled'=>!YII_DEBUG, // enable caching in non-debug mode * ), * ) * </pre> * * @param array application components(id=>component configuration or instances) */ public function setComponents($components) { foreach($components as $id=>$component) { //如果继承了IApplicationComponent,则立即set,否则放进_componentConfig数组中 if($component instanceof IApplicationComponent) $this->setComponent($id,$component); else if(isset($this->_componentConfig[$id])) $this->_componentConfig[$id]=CMap::mergeArray($this->_componentConfig[$id],$component); else $this->_componentConfig[$id]=$component; } }
之后这三行代码:
$this->configure($config); $this->attachBehaviors($this->behaviors); $this->preloadComponents();
每一行都做了很多工作,我们一步一步分析:
$this->configure($config);
CApplication并没有configure方法,因此我们查看父类CModule的configure方法:
public function configure($config) { if(is_array($config)) { foreach($config as $key=>$value) $this->$key=$value; } }
是否还记得$config这个变量?其实它是一个数组包含了一些基本配置信息,例如(yii自带blog demo):
return array( 'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..', 'name'=>'blog', 'defaultController'=>'post', …… }
configure看起来仅仅是将数组的键值对赋值给类的变量和值,其实这里使用了__set方法,而CModule并没有__set方法,因此看他的父类CComponent:
public function __set($name,$value) { $setter='set'.$name; //如果set开头的方法存在,则调用set方法进行赋值 if(method_exists($this,$setter)) $this->$setter($value); //如果有on开通的事件函数,则调用该事件函数处理 else if(strncasecmp($name,'on',2)===0 && method_exists($this,$name)) { // duplicating getEventHandlers() here for performance $name=strtolower($name); if(!isset($this->_e[$name])) $this->_e[$name]=new CList; $this->_e[$name]->add($value); } //如果只存在get方法,那么说明这个属性是制度的,抛出异常 else if(method_exists($this,'get'.$name)) throw new CException(Yii::t('yii','Property "{class}.{property}" is read only.', array('{class}'=>get_class($this), '{property}'=>$name))); //否则抛出异常 else throw new CException(Yii::t('yii','Property "{class}.{property}" is not defined.', array('{class}'=>get_class($this), '{property}'=>$name))); }
接下来是:
$this->attachBehaviors($this->behaviors);
依然调用的CComponent中的方法:
public function attachBehaviors($behaviors) { foreach($behaviors as $name=>$behavior) $this->attachBehavior($name,$behavior); }
事实上,这里$this->behavior还是空的,因此这里并没有做什么事情;
之后是:
$this->preloadComponents();
调用的是CModule中的方法:
protected function preloadComponents() { foreach($this->preload as $id) $this->getComponent($id); }
是否还记得config会配置一个键名为'preload‘的数组成员?在这里会将其中的类初始化;
最后调用的方法是:
$this->init();
首先调用了CWebApplication中的init方法:
protected function init() { parent::init(); // preload 'request' so that it has chance to respond to onBeginRequest event. $this->getRequest(); }
其中调用了父类的父类CModule中的方法init:
protected function init() { }
没有做任何事
到这里,new CreateWebApplication的工作全部完成,主要过程总结如下:
读取配置文件;
将配置文件中的数组成员赋值给成员变量;
初始化preload配置的类;
(未完待续)
发表评论
-
[转]PHP的内存管理
2015-05-11 22:03 889原文出处:http://blogread.cn/it/ar ... -
《高性能PHP应用开发》读书笔记
2014-12-24 09:20 799注:只记录了一些关键点,部分知识点/内容请看到的朋友 ... -
[转]HTTP缓存算法
2013-01-04 14:34 1385原文地址:http://www.p ... -
【转】漫谈社区PHP 业务开发
2012-11-19 10:07 1121原文地址:http://stblog.baidu-tech.c ... -
Yii分析13:Yii核心组件之AssetManager
2012-04-10 00:37 4400我们通过使用来讲解CAssetManager的使用和工 ... -
Yii分析12:Yii核心web组件之会话类CHttpSession
2012-03-06 09:44 3236CHttpSession提供session级的数据管理和配置 ... -
Yii分析11:Yii核心组件之错误处理类CErrorHandler
2012-02-24 09:57 4155类如其名,CErrorHandler在Yii中主要的功能 ... -
Yii分析10:Yii核心组件之数据库类CDbConnection
2012-02-17 09:18 8557数据库类几乎是每个PHP框架必不可少的组件之一,Yii的 ... -
Yii分析9:CController控制视图(Cview)的展现
2011-11-30 00:01 4894《The Definitive Guide to ... -
[转]优酷网架构学习笔记
2011-11-22 10:22 1450原文地址:http://www.itivy.com/ivy/a ... -
[转]YouTube架构学习体会
2011-11-22 10:15 1223原文地址:http://www.itivy.com/ivy/a ... -
[转]深掘XSS漏洞场景之XSS Rootkit
2011-10-21 12:22 1364转载顿神大作:http://www.80sec.com/%E6 ... -
Yii分析7:runController的执行
2011-10-20 17:28 6013在《Yii分析4:run的执行》一文中,介绍了Yi ... -
关于PHP错误:unexpected T_PAAMAYIM_NEKUDOTAYIM
2011-10-08 16:23 1979PHP解析错误:Parse error: syntax err ... -
[推荐]基于PHP和MySQL的开源点击统计软件Piwik
2011-08-10 11:50 1767刚刚发现一款基于PHP和MySQL的开源点击统计软 ... -
PHP的is_callable和method_exists方法比较
2011-08-03 13:17 2239之前发过一篇关于is_callable的文章,主要是PHP手册 ... -
Yii分析6:CHttpRequest
2011-08-03 11:20 2897官方说明:CHttpRequest封装了$_SERVER变量, ... -
[转]10种方式实现跨域资源的共享
2011-07-27 10:50 1077原文地址:http://www.ued16 ... -
[转]高级PHP应用程序漏洞审核技术
2011-07-19 10:18 1936原文地址:http://code.google.com/p/p ... -
使用PHP的SESSION直接保存对象需要注意隐含的序列化
2011-06-23 14:12 3394昨天在调试代码时,在同一个sever上有两个版本的代码,刚开始 ...
相关推荐
"yii-basic-app-2.0.12"是Yii2框架的一个基础应用程序模板,适用于初学者和小型项目。这个模板提供了构建Web应用的基本结构和配置,让开发者能够快速上手。 1. **目录结构**: - `config`:包含应用程序的配置文件...
Yii 2.0 是一款基于组件的高性能 PHP 框架,用于开发 Web 2.0 应用程序。此框架提供了丰富的特性,包括 MVC(模型-视图-控制器)架构模式、活动记录(Active Record)、依赖注入(Dependency Injection)、单元测试...
### Yii框架快速入门详解 #### 一、Yii框架概述 ...通过深入理解其核心概念,如入口脚本、应用程序以及MVC架构的运用,开发者可以充分利用Yii的强大功能,快速构建出稳定、高效且可维护的Web应用。
2. 高级版YII2框架:适用于大型复杂的Web应用程序,提供了更清晰的模块化结构和多应用支持。高级版分为前端和后端两个独立的应用,每个应用都有自己的入口脚本、控制器、模型和视图,以及独立的配置,可以更好地分离...
入口文件是每个 Web 应用程序的起点,对于 Yii 而言,`index.php` 文件是应用的入口。在这个文件中,Yii 的主要配置和初始化过程发生。例如,`$yii` 变量指向了框架的核心入口点 `yii.php`,而 `$config` 指向应用...
Yii2 是一个高性能的、基于组件的 PHP 框架,用于开发Web应用程序。它遵循“简洁即高效”的设计理念,提供了丰富的特性,如MVC(Model-View-Controller)、I18N/L10N(国际化和本地化)、缓存管理、数据库抽象层以及...
1. **性能优化**:Yii 2.0.6 可能对框架的一些核心组件进行了性能优化,例如查询构建器、路由解析和视图渲染,使得应用程序运行更快。 2. **错误修复**:开发者通常会遇到各种 bugs,Yii 社区会积极跟踪并修复这些...
Yii PHP 框架分析 Yii 是一个高性能的,基于组件的 PHP 框架,用于开发 Web2.0 应用程序。本分析将深入探讨 Yii 的基本操作,包括...通过深入理解这些基础知识,开发者能够更好地利用 Yii 构建高质量的 Web 应用程序。
2. **目录结构**:Yii2 Basic的目录结构清晰,包括了`web`(Web服务器的入口目录)、`config`(配置文件)、`runtime`(运行时生成的文件)、`models`(模型)、`controllers`(控制器)、`views`(视图)等。...
1. 高重用性:Yii框架设计了大量可重用的组件和功能模块,以便开发者可以简单地复用这些模块来快速构建应用程序。 2. 高效性:Yii使用懒加载和数据缓存等技术手段,减少了不必要的资源消耗,显著提高了应用程序的...
1. **项目入口脚本**:在Yii框架中,项目的入口脚本通常命名为index.php,该脚本包含引导文件yii.php和配置文件main.php。index.php脚本会设置两个关键常量YII_DEBUG和YII_TRACE_LEVEL,分别用于控制调试模式的开启...
Yii2 是一个基于组件、高性能的 PHP 框架,用于开发 Web 2.0 应用程序。"Advanced Yii2 Framework" 提供了一个高级项目结构,适合大型企业级应用或者需要复杂前后端分离的项目。它将应用程序分为前端、后端和共同...
1. **程序结构及配置** Yii的项目结构通常包含以下关键部分: - `protected`:存放应用的核心代码,如模型、控制器、配置文件等。 - `runtime`:运行时目录,存储日志、缓存文件等。 - `webroot`:网站的公共...
- `web/`:Web 根目录,包含入口脚本、静态资源(CSS、JS 文件)等。 - `.gitignore`:定义了版本控制系统忽略的文件和目录。 - `composer.json`:定义项目依赖和元数据,用于 Composer 包管理。 - `README.md`:...
Yii是一个基于PHP语言的开源Web应用框架,提供了许多便捷的功能和工具来帮助开发者快速构建Web应用程序。本文主要对Yii框架的源码进行分析,探究其内部机制和实现原理。 1. 启动机制 Yii框架的启动机制是通过index...
1. 性能优越:Yii框架采用了各种优化技术,保证了Web应用的高性能,尤其在处理大量数据和高流量的Web应用时表现优异。 2. 组件化设计:Yii框架采用基于组件的设计模式,开发者可以通过复用组件快速组装出复杂的Web...
在Web开发中,Yii2 Console组件常用于处理后台任务,如定时任务、数据迁移等。然而,对于需要即时响应或者非阻塞操作的任务,如注册邮件发送、短信通知等,我们可以利用Swoole扩展来实现异步处理,从而提高系统效率...
值得注意的是,并非所有Yii脚本都需要暴露给Web用户,仅需确保入口脚本可供访问即可。 - **环境检测**:安装完成后可以通过浏览器访问`http://hostname/path/to/yii/requirements/index.php`以检查服务器是否满足...
Yii2框架是PHP社区中最流行的高级Web开发框架之一,它基于组件、...通过这个初始项目,开发者可以快速了解Yii2框架的架构和工作原理,同时也是一个很好的起点,可以根据需求扩展和定制功能,打造自己的Web应用程序。