phalcon:数据库分库,读写分离,负载均衡 系统方法执行顺序
用命名空间区分不同的数据库实例,对应代码结构上是不同的目录区分,在同一目录下基类负责初始化连接。连接来自初始化时注入的多个db服务
隐规则:
-
initialize()在每个请求期间只会调用一次
-
为每个 new 创建的实例执行初始化任务使用onConstruct()
namespace CompanyModelsNotification;
1 /** 2 * Class BaseModel 3 * 4 * beforeSave()和afterFetch()成对使用,用于读写数据时自动转化数据。 5 * 例如自动执行serialize unSerialize 6 * 7 * save()发生时事件调用顺序是 8 * initialize, 9 * onConstruct, 10 * beforeValidation, 11 * beforeValidationOnCreate, 12 * afterValidationOnCreate, 13 * afterValidation, 14 * beforeSave, 15 * beforeCreate, 16 * afterCreate, 17 * afterSave, 18 * 19 * @package CompanyModelsNotification 20 */ 21 class BaseModel extends PhalconMvcModel 22 { 23 24 /** 25 * - initialize()在每个请求期间只会调用一次 26 * - 子类必需调用父类方法 27 * - 为每个 new 创建的实例执行初始化任务使用onConstruct() 28 */ 29 public function initialize() 30 { 31 $this->setConnectionService('db_notification'); 32 33 //$this->setConnectionService('node1'); 34 //$this->setConnectionService('node2'); 35 // 36 //真实场景可能使用mysqlnd_ms扩展或者haproxy 37 //仅演示读负载均衡一种思路 38 //$dbSlave = ['node1', 'node2', 'node3']; 39 //$key = array_rand($dbSlave); 40 //$db = $dbSlave[$key]; 41 //$this->setReadConnectionService($db); 42 // 43 // 44 //$this->setReadConnectionService('dbRead'); 45 //$this->setWriteConnectionService('dbWrite'); 46 } 47 }