Php-binlog触发处理

来自技术开发小组内部wiki
跳转至: 导航搜索

开发说明

为解决在业务中进行各处埋点的问题,需要集中控制进行埋点部署,减少遗漏点,方便统一控制,通过探讨可以从mysql的binlog入手进行底层分析,建立数据更新触发机制,形成
埋点逻辑的统一处理

重点参考

php-binlog: https://github.com/BullSoft/php-binlog

前提条件

mysql需要开启binlog日志,并且其格式记录为row格式,因此需要预先调整好

安装要求

需要用到C++的boost库,因此需要提前安装,yum install boost-dev

注意事项

  1. 不能进行重复触发更新,比如更新A表,触发B表更新,然后B表的更新又触发A表的更新处理,然后形成内部死循环处理,因此在业务层面需要重点控制不能形成链条
  2. 触发执行的处理逻辑,不能有前后的依赖关系,目前框架层面并没有考虑好先后依赖关系处理,比如针对fmb_order_info表进行了触发逻辑处理A,接下来针对fmb_order_goods

触发了逻辑处理B,但是B要依赖于A的处理结果

代码逻辑

后台触发

/home/www/fmb.daemon/trigger_binlog.php --run=test >> ./trigger.log
主要是利用扩展来从数据库获取binlog日志变化,通过配置文件trigger.config来配置具体需要关注的表,在该配置文件变动的时候能够自动更新

处理逻辑

/home/www/fmb.dianping/application/controllers/cmdrun/trigger_binlog.php 
该文件是用来执行该类触发处理逻辑的父类,主要是封装了数据解析,提供了统一的方法,隐藏了复杂的细节提供了简单的输出接口

代码示例

具体的触发处理逻辑需要自己来编写,约定的方式是这样的:在cmdrun目录下面,必须以“表名”作为文件命名后面加以“_trigger.php”:fmb_admin_log_trigger.php
其中有三个统一约定的方法:write_trigger;update_trigger;delete_trigger;具体的函数原型查看如下的代码
<source lang='php'>

<?php // /////////////////////////////////////////////////// // Copyright(c) 2016,父母邦,帮父母 // 日 期:2016年11月30日 // 作 者:卢少锦 // E-mail :shaojin.lu@fumubang.com // 文件名 :fmb_admin_log_trigger.php // 创建时间:上午11:40:09 // 编 码:UTF-8 // 摘 要:一个测试触发执行实例 // ///////////////////////////////////////////////////


if (!defined('BASEPATH')) exit('No direct script access allowed'); //必须加载该系统类 require_once(APPPATH . "controllers/cmdrun/trigger_binlog.php");

class fmb_admin_log_trigger extends trigger_binlog{

   public function __construct(){
       parent::__construct();
   }
   
   /**
    * 写入事件触发
    * @param string $tableName
    * @param array $row
    */
   public function write_trigger($tableName=,$row=array()){
       //需要子类继承实现
       
   }
   
   /**
    * 更新事件触发
    * @param string $tableName
    * @param array $rowBefore  变更前数据
    * @param array $rowAfter   变更后数据
    * @param array $diffField  差异数据
    */
   public function update_trigger($tableName=,$rowBefore=array(),$rowAfter=array(),$diffField=array()){
       //需要子类继承实现
   }
   
   /**
    * 删除事件触发
    * @param string $tableName
    * @param array $row
    */
   public function delete_trigger($tableName=,$row=array()){
       //需要子类继承实现
   }

}

</source>