CI

CI官网

优雅的 CodeIgniter
CodeIgniter 是一个小巧但功能强大的 PHP 框架,作为一个简单而“优雅”的工具包,它可以为开发者们建立功能完善的 Web 应用程序。

入门

请求

CI框架中,所有请求必须经过index.php的转发。直接访问是非法的,这提高了框架安全性。
例如 http://127.0.0.1:8000/index.php/api/test/xx/xxxx

配置

配置文件在 /config/global.conf.php
可以配置数据库,mancache,以及全局的一些变量

通用函数/类

/common/ 目录下可以新建php文件,该文件可以是一个类,也可以是面向过程的一些函数。
在Controllers中调用时,请用

1
2
3
include_once("common/functions.php");
或者
require_once 'common/functions.php';

include_once 功耗小,找不到文件时报warning
equire_once 功耗大,找不到文件时报error

架构

我要介绍的架构是最近公司的两个项目所采用的基于CI的架构。架构师也说以后要开源,那我就简单介绍一下吧。

  1. /application/models/中编写所有抽象的数据库crud方法
  2. /application/controllers/目录中根据不同客户端需求,新建不同的文件夹,例如apih5,web等。
  3. /application/controllers/目录下新建Base.php
    1. Base.php放所有服务必须的函数,例如checkParamscheckSigngetCache
    2. Base类extends CI_Controller
    3. 重载__construct初始化函数,load model中需要的模型
  4. /application/controllers/的每个子目录中,例如api子目录下,创建ApiBase.php
    1. ApiBase extends Base
    2. 此文件放,当前客户端类型下所需的公共函数方法等。例如checkUserSession
    3. 重载__construct初始化函数,为其父函数的初始化函数
  5. /application/controllers/api中的所有类 extends ApiBase
  6. /application/controllers/api中新建test文件夹,用于单测
    1. test中的单测文件固定传参,用于单元测试
  7. common/目录下写好log.php文件。所有的请求都写log

库类

抽象出一种通用类,可以在system/libraries目录下观察系统库类,在applicatoin/libraries下编写自己的库类,可以覆盖系统库类

封装与暴露

我之前没有很好理解这个,导致框架设计出了很多问题,给自己挖了一个大坑。
暴露所谓暴露的是系统的可公开数据,
封装所有底层服务的数据,不可公开的函数,全部封装

其他

ffmpeg

一种开源视频图片转码神器。指定参数DIY,随意转换。

curd

百度的人称数据库的增删改查为curd。增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete).

salt

用户密码的散列存储前别忘了加“盐”

自动报警

1
2
3
4
5
[2017-09-08 11:19:02][127.0.0.1][os=-1][uri=xxx][err_no=0][err_msg=success][time=0.814654][params=]
[2017-09-08 11:20:02][127.0.0.1][os=-1][uri=xxx][err_no=0][err_msg=success][time=0.691285][params=]
[2017-09-08 11:21:01][127.0.0.1][os=-1][uri=xxx][err_no=0][err_msg=success][time=0.732456][params=]
[2017-09-08 11:22:02][127.0.0.1][os=-1][uri=xxx][err_no=0][err_msg=success][time=0.874284][params=]
[2017-09-08 11:23:02][127.0.0.1][os=-1][uri=xxx][err_no=0][err_msg=success][time=4.865282][params=]

以上是系统log,比如最后一次访问出现了4S的时间,很明显有问题。不写报警的话我每天都要定时看log检查一下,或者开个终端tail log。很烦。
写一个shell,如果出现一秒以上的延时,就发邮件给我,岂不美哉。