1. Yii源码阅读笔记 - 模板引擎集成

    概述

    通常我们会使用模板引擎来渲染HTML页面,而不是使用HTML代码中插入PHP代码的方式来编写动态页面。Yii框架中模板引擎也是作为组件引入的,默认ID为viewRenderer, 但从Yii源码阅读笔记 - 组件集成可以看到Yii Web应用加载的核心组件中并没有viewRenderer,所以需要自己配置。 Yii提供了一个直接可用的模板引擎组件类CPradoViewRenderer(见文件yii/framework/web/renderers/CPradoViewRenderer.php),该模板引擎类让开发者可以使用类Prado框架的模板语法。

    如果你想使用Smarty这种第三方模板引擎,有两种方式将模板引擎引入Yii中使用(以Smarty为例):

    1. 将Smarty封装成一个Yii的普通组件,然后配置加载到Yii::app()。假设组件ID为smarty,那么就可以通过Yii::app()->smarty来调用组件。
    2. 参考CPradoViewRenderer类的实现,将Smarty封装成一个模板引擎组件,并以ID为viewRenderer进行配置加载。

    相比而言,第二种方式更好。原因是:第一种方式由于每种第三方模板引擎的接口不一样,如果应用要替换模板引擎,就需要修改控制器类中的代码。而第二种方式由于第三方组件统一封装成Yii框架定义的模板引擎接口形式, 所以如果要替换模板引擎,只需修改自定义模板引擎组件类的接口实现就可以了。这样调用模板引擎的代码逻辑就只依赖接口形式,而不是依赖于接口实现,从而实现解耦。

    本文主要分析第二种方式的实现。

    分析

    Yii中对页面模板进行渲染可以调用 ...

    Tagged as : PHP Yii 笔记 总结
  2. Yii源码阅读笔记 - Model层实现

    概述

    Yii中,对Model层的使用,有两种方式:

    1. 通过类CDbConnection和CDbCommand来操作
    2. 使用ORM形式:编写model类继承自抽象类CActiveRecord

    第1种方式的示例如下:

    <?php
    $connection = Yii::app()->db;  // 或者Yii::app()->getComponent('db');
    $queryResult = $connection->createCommand($sql)->queryRow();
    

    第2种方式中编写的model类可能需要实现方法getDbConnectionmodeltableName

    在实现上,第2种方式是基于第1种方式的,即第2种方式的抽象程度更高。Yii没有屏蔽第1种方式,这样能让开发者按需选择。 但我个人并不喜欢这样,两种方式同时存在,会导致应用的model实现稍显混乱。

    分析

    Yii框架model层的入口为CDbConnection类,该类有很多public的属性可供配置,如connectionStringusernamepassword等。

    根据Yii源码阅读笔记 - 组件集成一文可知,组件初始化时会调用init方法。 类CDbConnection的init类实现如下:

    public function ...
    Tagged as : PHP Yii 笔记 总结
  3. Yii源码阅读笔记 - 组件集成

    概述

    Yii框架将各种功能封装成组件,使用时按需配置加载,从而提高应用的性能。内置的组件又分为核心组件与非核心组件,核心组件是任何Web应用和Console应用都需要的。 此外,应用开发者还可以按照一定规则封装配置使用自己的功能组件。Yii会把应用需要的组件都加载到应用容器Yii::app()中,使得组件的使用方式一致方便。

    基于Yii框架开发应用需要理解如何配置组件、如何开发自己的组件,对应着需要理解Yii是如何注册加载组件的。

    分析

    Yii源码阅读笔记 - 请求处理基本流程一文可知,Yii加载组件的入口为抽象类CApplication构造方法中的以下两行代码:

    $this->registerCoreComponents();
    $this->configure($config);
    

    registerCoreComponents方法定义于类CWebApplication中,用于加载Web应用的核心组件,组件列表如下:

    array(
        // 核心组件
        'coreMessages'=>array(
            'class'=>'CPhpMessageSource',
            'language'=>'en_us',
            'basePath'=>YII_PATH.DIRECTORY_SEPARATOR.'messages',
        ),
        'db'=>array(
            'class'=>'CDbConnection',
        ),
        'messages'=>array(
            'class ...
    Tagged as : PHP Yii 笔记 总结
  4. Yii源码阅读笔记 - 路由解析

    概述

    Yii框架的路由解析功能由核心组件urlManager来完成。路由的形式有两种:

    • get:通过URL中查询字符串(query string)参数r来指定路由,如:r=controllerID/actionID
    • path:直接通过URL来指定,如:/controllerID/actionID

    默认使用get路由形式。由于Yii中controller类命名和action方法都是按照规则命名的,而路由也是按照规则来匹配的,所以完全可以不用额外配置urlManager。

    若需要使用path方式,则可如下配置:

    "components" => array(
        'urlManager' => array(
            'urlFormat' => 'path',
            'rules' => array(
                ...
            ),
    ),
    

    进一步说明可参考RESTful API设计的一点经验一文。

    分析

    在“请求处理基本流程”一篇可以看到Yii框架路由解析流程的入口在类CWebApplication的processRequest方法中:

    $route=$this->getUrlManager()->parseUrl($this->getRequest());
    

    其中getUrlManager方法定义于类CApplication中,作用是初始化获取URL管理组件(ID为urlManager),实现如下:

    public ...
    Tagged as : PHP Yii 笔记 总结
  5. Yii源码阅读笔记 - 请求处理基本流程

    对于Web框架,我认为其主要有三点作用:

    1. 提供多人协作的基本规范
    2. 避免重复造轮子
    3. 开发者只需关注业务逻辑,脏活(如:基本的安全防范、兼容问题)Web框架都已完成并提供设计良好的API

    但代价是学习成本 - 为了尽可能发挥Web框架的优势,需要花一些阅读文档,甚至是框架源码(特别是文档缺乏或者文档写得垃圾的),然后经过几次项目实践,一切才能了然于胸。

    喏,为了在工作中更好地使用、避免误用Yii框架,大致阅读了Yii框架的部分代码,然后有了这个系列的笔记。


    深入学习一个Web框架,首先要理解的是请求处理流程。对于PHP而言,处理流程也即包含了应用的初始化过程,如加载配置、初始化组件等。请求处理流程中最核心的应该是路由解析和分发,此外可能还有过滤器处理、事件处理等,直到请求处理进入具体的Controller和Action。响应生成、过滤等也可以关注。


    基于Yii框架的工程目录结构大致如下所示:

    Yii-Project-Structure

    • index.php是应用的入口
    • protected目录是存放动态脚本的地方
      • components子目录存放各种组件类
      • configs存放应用的配置文件
      • controllers存放Controller类文件
      • models存放Model类文件
      • runtime存放一些应用生成的临时文件或者缓存文件,如Smarty编译好的模板、日志文件
      • views存放View模板文件
    • static目录存放静态文件,如CSS、JS、图片等 ...
    Tagged as : PHP Yii 笔记 总结
  6. QCon上海2014大会见闻录

    技术

    主题演讲

    软件项目变更的管理和生存之道

    个人对这个演讲的印象比较深。演讲者即是最近比较火的《Java程序员修炼之道》一书的作者。

    演讲大致以“提出问题 -> 分析问题 -> 解决问题”的思路陈述。

    问题是:在软件演化的整个过程中,变化是始终存在的。如:

    • 基础架构层面的变化:迁移到新的服务提供商、系统升级
    • 用户数的变化:突然的增长、持续稳定地增长
    • 代码的变更:发布新版本、依赖库升级、新的子系统

    这些变化可能会导致两个问题的发生:

    • 服务中断:完全无法为用户提供服务,特别是生产环境变更导致的,发布后的服务中断
    • 性能问题:性能退化/降级,但可能也不是完全不可用,在预览版(pre-release)和正式发布后(post-release)都可能发生,经常是因为不完全的性能测试造成的。(性能测试是指基于测量的方法来理解一定负载下应用的行为)

    “变化”导致的问题,说到底是人为造成:

    No matter what ...

    Tagged as : 笔记 总结
  7. 回顾2013,展望2014

    2013已经过去了。

    时间消逝得太快,以至于很多事情在记忆上相互重叠,无法明确区分事情发生的时间点。那么该如何回顾这过去的一年?

    工作

    2013,参加工作的第一年,我几乎全身心地扑在工作上,自认为做了一些事情,也有很多收获,愉快而充实。技术工作于我而言,更多的 是一种兴趣、乐趣。

    非常感谢领导、导师以及伙伴。领导、导师给了我很大的空间,导师始终耐心地给于业务和技术的指导,和伙伴的合作非常愉快。

    这一年,如果说我有了些许成长进步,很大程度上归功于他们。

    这些话说得也许有些像获奖感言,却是发自我的真心。

    生活

    2013,我和老婆,订婚、领证,终于结束了长达5年的异地恋,从此以后会有个人始终和我“相依为命”,面对或许琐碎的每一天,在城市飘荡的 日子也不会再孤单,我很安心,很踏实。

    现在,我没车、没房,每个月的工资也不算高,但我始终在努力,除了为自己,还因为有个人值得你去努力把生活过得更好。

    为了记录我们以前和以后人生中的重要时刻,我特意创建了一个大事年表网页 ...

    Tagged as : 总结
  8. HAProxyConsole简介

    之前在Golang中如何让html/template不转义html标签搭建高可用负载均衡组件及缓存DNS两篇文章中都提到为了方便使用HAProxy,我实现了一个简单的HAProxy负载均衡任务管理系统。前些天我把代码放在Github上,算是开源吧。

    同事使用该管理系统,遇到问题时,由于不清楚其实现,也就无法分析问题出在哪,同时也会有些恐慌,生怕搞挂了HAProxy,毕竟上面承载了一些关键的业务,所以我绘制一张图用于说明HAProxyConsole的应用场景和工作原理。

    HAProxyConsole-arch

    图中蓝色标识的部分都属于HAProxyConsole。

    • 用户通过Web页面增/删/改/查负载均衡任务,但这4个操作直接修改的都仅是数据库(DB.json或MySQL数据库)。另外,HAProxyConsole的Web页面中还嵌入了主从HAProxy自带的数据统计页面。
    • 只有当用户点击按钮“应用到主HAProxy”或“应用到从HAProxy”后,HAProxyConsole才会根据DB.json或MySQL中存储的数据和配置文件haproxy_conf_comm.json生成最新的HAProxy配置文件,然后拷贝一份为主HAProxy的配置文件或远程拷贝一份为从HAProxy的配置文件,最后重启HAProxy进程(/path/to/haproxy/sbin/haproxy -f /path/to/haproxy/conf/haproxy.conf -st ...

Page 2 / 3