Php-binlog触发处理
来自技术开发小组内部wiki
开发说明
为解决在业务中进行各处埋点的问题,需要集中控制进行埋点部署,减少遗漏点,方便统一控制,通过探讨可以从mysql的binlog入手进行底层分析,建立数据更新触发机制,形成 埋点逻辑的统一处理
重点参考
php-binlog: https://github.com/BullSoft/php-binlog
前提条件
mysql需要开启binlog日志,并且其格式记录为row格式,因此需要预先调整好
安装要求
需要用到C++的boost库,因此需要提前安装,yum install boost-dev
注意事项
- 不能进行重复触发更新,比如更新A表,触发B表更新,然后B表的更新又触发A表的更新处理,然后形成内部死循环处理,因此在业务层面需要重点控制不能形成链条
- 触发执行的处理逻辑,不能有前后的依赖关系,目前框架层面并没有考虑好先后依赖关系处理,比如针对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>