PHP扩展实战——目标和计划

好了,现在来整理一下我们要做的工作。

功能目标

既然是要做一个记日志的扩展,那当然就避免不了两个功能:

  1. 格式化日志流
  2. 将日志流推送到特定目标(通常是写入文件)

这两个是最核心的功能,其他的都是辅助。但辅助也可以很贴心,所以我设计了以下功能:

  1. 尽可能多的从扩展层面获取共用的信息,比如时间、客户端IP、当前机器的IP等(这里涉及超全局变量的获取)
  2. 设计尽量简单的默认规则,既可以开箱即用,又可以随心配置
  3. 遵守PSR-3规范
  4. 命名空间和传统写法的兼容(鸟哥的Yaf是教科书)

还有一个需要考虑的问题是高并发场景下的文件写入丢失问题,我觉得以我目前的水平是无法解决这个问题的,那没关系,PHP内置的已经有强大的error_log方法了,它可以保证这点,用它就可以。喂等等,那既然已经有了error_log,我干嘛还要做这个呢?

因为它不够灵活。

我们通常的做法是封装error_log方法,填充默认参数、格式化、写入文件等,error_log方法本身是很快的,但挡不住我们添加的这些代码的消耗也很大,因为写日志是个非常频繁的操作,所以一个极小的性能损失积累下来都可能影响很大。

取名

既然用C写,那就是奔着高性能去的,High Performance PHP Log,叫Hilog貌似就可以,但为了致敬鸟哥,把i换成y好了:)所以叫Hylog。

类的设计

  1. 拥有PRS-3规定的8个level作为常量
  2. 对应8个方法,分别写到不同的文件
  3. 一个log方法比上述8个方法多个level参数,上述8个函数实际是调用这个方法记日志的
  4. 格式化日志的方法
  5. 数组插值的方法

依赖关系

依赖PHP内置函数error_log