phalcon:数据库分库,读写分离,负载均衡 系统方法执行顺序
用命名空间区分不同的数据库实例,对应代码结构上是不同的目录区分,在同一目录下基类负责初始化连接。连接来自初始化时注入的多个db服务
隐规则:
-
initialize()在每个请求期间只会调用一次
-
为每个 new 创建的实例执行初始化任务使用onConstruct()
namespace Company\Models\Notification;
/**
* Class BaseModel
*
* beforeSave()和afterFetch()成对使用,用于读写数据时自动转化数据。
* 例如自动执行serialize unSerialize
*
* save()发生时事件调用顺序是
* initialize,
* onConstruct,
* beforeValidation,
* beforeValidationOnCreate,
* afterValidationOnCreate,
* afterValidation,
* beforeSave,
* beforeCreate,
* afterCreate,
* afterSave,
*
* @package Company\Models\Notification
*/
class BaseModel extends \Phalcon\Mvc\Model
{
/**
* - initialize()在每个请求期间只会调用一次
* - 子类必需调用父类方法
* - 为每个 new 创建的实例执行初始化任务使用onConstruct()
*/
public function initialize()
{
$this->setConnectionService('db_notification');
//$this->setConnectionService('node1');
//$this->setConnectionService('node2');
//
//真实场景可能使用mysqlnd_ms扩展或者haproxy
//仅演示读负载均衡一种思路
//$dbSlave = ['node1', 'node2', 'node3'];
//$key = array_rand($dbSlave);
//$db = $dbSlave[$key];
//$this->setReadConnectionService($db);
//
//
//$this->setReadConnectionService('dbRead');
//$this->setWriteConnectionService('dbWrite');
}
}