Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Zend框架应用层中的主/从交换机_Php_Zend Framework_Datamapper_Master Slave - Fatal编程技术网

Php Zend框架应用层中的主/从交换机

Php Zend框架应用层中的主/从交换机,php,zend-framework,datamapper,master-slave,Php,Zend Framework,Datamapper,Master Slave,我正在编写一个应用程序,它要求主/从开关发生在应用程序层内部。正如现在一样,我在创建映射器时实例化了一个Zend_Db_表对象,然后将DefaultAdapter设置为从属对象 现在在基本映射器类中,我有以下方法: public function useWriteAdapter() { if(Zend_Db_Table_Abstract::getDefaultAdapter() != $this->_writeDb) { Zend_Db_Table_Abst

我正在编写一个应用程序,它要求主/从开关发生在应用程序层内部。正如现在一样,我在创建映射器时实例化了一个Zend_Db_表对象,然后将DefaultAdapter设置为从属对象

现在在基本映射器类中,我有以下方法:

public function useWriteAdapter()
{
    if(Zend_Db_Table_Abstract::getDefaultAdapter() != $this->_writeDb)
    {
        Zend_Db_Table_Abstract::setDefaultAdapter($this->_writeDb);
        $this->_tableGateway = new Zend_Db_Table($this->_tableName);
    }
}

我需要检查一下这个。我不认为开销太大,我只是怀疑一定有更好的方法。

如何扩展执行启动的基类

class My_Db_Table extends Zend_Db_Table
{
    function init() 
    {
        if (....) {
           // set the default adaptor to the write-DB-master
        }
        parent::init();
    }
}
// all your models then extend My_Db_Table instead of Zend_Db_Table

类型为
Zend\u Db\u Table\u Row\u Abstract
的对象会记住生成它的表对象。但是,您可以在调用
save()
之前更改关联的表


虽然你很可能已经想出了一个解决方案,但我仍将以我的方式发布: 我一直在为同样的问题寻找解决方案,并想出了将其逻辑放入适配器的想法

我扩展了Zend_Db_Adapter_抽象,并添加了布尔属性$writes。我还为它添加了公共getter和setter方法

我的适配器保存两种不同的数据库配置/-连接:一种用于主机(用于写入),另一种用于从机(用于读取)。(事实上,这不是一种配置,而是多种配置,所以我有一个按重量随机选择的大师级和药膏库。)


现在我执行以下操作:在执行查询之前,必须将$writes设置为true或false。在connect()方法中,适配器根据$writes的值连接或使用正确的连接。

我仍然需要能够动态切换DB适配器,因此我不确定这是否可行。
$readDb = Zend_Db::factory(...);  // replica
$writeDb = Zend_Db::factory(...); // master
Zend_Db_Table::setDefaultAdapter($readDb);

$myReadTable = new MyTable(); // use default adapter
$myWriteTable = new MyTable($writeDb);

$row = $myTable->find(1234)->current();

$row->column1 = 'value';

$row->setTable($myWriteTable);

$row->save();