深入了解PHP生命周期

一.背景

日志在WEB应用中的使用非常广泛,记录访问者IP,访问者操作的数据,接口请求的信息,异常提示信息等,尤其在产品环境中,我们往往需要通过日志来分析当前应用的运营情况,是否在存在一些不可见的未知错误。

在程序实现过程中,我们设计的输出日志往往都是在程序运行当中,如:

  • 连接数据库失败了,捕捉到异常后,往本地磁盘写入一条日志;
  • 图片上传时间超时,往本地磁盘写一条日志;
  • 渲染页面中出现XSS攻击,往网络日志服务器写一条日志;
  • 请求对方服务器Api接口,出现超时,往网络日志服务器写一条日志;
  • ……

自动化测试过程中常规策略

一.背景

Session称为会话,是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间,如果需要的话,可能还有一定的操作空间。通常情况下Session用于存储需要在整个用户会话过程中保持其状态的信息,例如登录信息或用户浏览 Web应用程序时需要的其它信息。

PHP的 $_SESSION 的功能之所以如此强大是因为有WebServer的支持,试想一下如果在命令行下读取一个 $_SESSION 变量,会是什么结果?

必然是null,因为PHP的session_start()函数在命令行下是无法使用的,假若一段逻辑结果中含有这个Session会话变量,该如何去测试它的有效性?

实现读取缓存在数据访问层中抽离策略

一. 背景

使用数据缓存在WEB工程中是一个非常有意义的策略,不仅仅可以减少数据库负载,而且当数据缓存在内存中,能大大提高了的读取速度。

在WEB设计中,我们往往忽略一个重要的信息 – Key,每当我们需要缓存的时候,只是单纯的对一个Key进行SET或者GET操作,时间长了,也许就出现了以下的问题:

  • 这个数据缓存的Key是什么;
  • 这个数据缓存生命周期有多长;
  • 如何不获取这个数据缓存,而得到实际的数据做测试;
  • 在其他项目中同时可能用到这个数据缓存,如何重置这个缓存
  • ……

这就造成了我们平时常见的一种场景,一位同事查到原因,高喊:

“Shit!为什么生产环境上的数据总是测试有问题,测试环境都好好的,线上一定是有缓存,但是我们怎么把它清除掉!

在Yaf应用中,创建一个模型层UserModel:

Class UserModel {
    // 初始化连接数据库,pre_common_member只有三条数据ID:1,2,3
    public function __construct() {
        $this->_db = Core_LinkMySQL::get('hiapk_x2');
    }

    // 通过uid获取用户名,数据不存在时返回FALSE
    public function fetchUsernameById($id) {
        return $this->_db->select('username')
            ->from('pre_common_member')
            ->where('uid', $id)
            ->fetchValue();
    }

    // 通过uid获取用户行数据,数据不存在时返回FALSE
    public function fetchRowById($id) {
        return $this->_db->select('username', 'groupid', 'adminid', 'regdate')
            ->from('pre_common_member')
            ->where('uid', $id)
            ->fetchOne();
    }
}

在Yaf应用中,创建一个控制层UserController:

Class UserController extends Yaf_Controller_Abstract {
    // init方法相当于控制器的初始化函数,取消自动渲染视图
    public function init() {
        Yaf_dispatcher::getInstance()->disableView();
    }
    // 输出需要的JSON信息
    private function __responseJson($code=0, $data=FALSE) {
        $response = json_encode(array('code'=>$code, 'data'=>$data));
        $this->getResponse()->setBody($response);
    }
    // JSON Action
    public function jsonAction($uid=0) {
        if ( $uid < 1 ) return $this->__responseJson(-1);

        $user_model = new UserModel();
        $row = $user_model->fetchRowById($uid);
        return $this->__responseJson(0, $row);
    }
}