3.1 日志路由组件
在 HTTP 请求过程中,往往需要记录多条日志。我们可以从两个维度对日志进行分类:业务逻辑和严重级别。业务逻辑涵盖数据库操作、用户中心接口、Drmc 接口及 Memcache 更新等;严重级别则包括 trace、info、profile、warning 和 error。
日志处理流程大致分为五个阶段: 首先是根据配置生成日志记录对象(如 CFileLogRoute、CEmailLogRoute、CWebLogRoute),由路由组件统一管理。接着,程序员调用写日志接口,日志暂时保存在 PHP 数组缓冲区中。当缓冲区满或请求结束时触发 Flush 事件,通知路由组件获取日志(这里运用了观察者模式)。随后,各个记录对象按需提取日志,最后分别持久化存储,比如写入文件、发送邮件或输出到 Web 页面。
3.2 Url 管理组件
该组件主要负责解析用户输入的 URL 以定位 Controller 和 Action,并将参数注入 $_GET;同时也支持根据路由和参数反向生成 URL。核心类是 CUrlRule。
初始化时,CUrlRule 会设置六个关键成员变量。解析 URL 分三步:匹配 pattern 规则提取字段、通过 references 替换引用字段、将 params 加入 $_GET。创建 URL 同样分三步:解析 routePattern 获取字段、合并输入参数、用模板替换生成最终 URL。
3.3 异常处理组件
CApplication 将 handleException/handleError 注册为事件句柄,捕获所有异常并交由异常处理组件处置。主要任务是向浏览器端展示异常信息。对于普通请求返回异常页面,若是 AJAX 请求则返回 JSON 数据供前端 JS 渲染。
3.4 Cache 组件
缓存能显著提升 Web 性能。常用方案包括 memcache、apc 和 redis 等。Yii 定义了 CCache 类,为访问不同缓存后端提供了统一接口。
3.5 访问控制组件
Yii 通过 CAuthManager 实现了分等级的 RBAC(基于角色的访问控制)机制。
3.6 全局状态组件
用于存储持久化信息,数据序列化后保存至 application.runtime.state.bin 文件。该组件提供特定接口供 CApplication 进行持续存储。

