我在Symfony2中使用Doctrine2主/從配置來在單個主數據庫和多個只讀(複製)從服務器上擴展我的應用程序。如何使用Symfony2控制檯命令中的主/從doctrine2配置
這在我的應用程序中完美工作,Doctrine2理智地使用從服務器進行只讀查詢,主服務器進行寫操作。
如果在我的控制器之一,我寫道:
$em = $this->get('doctrine')->getManager();
var_dump($em->getConnection()->isConnectedToMaster());
isConnectedToMaster()
回報false
- 這是我所期望的,因爲從被默認連接。
這也是如此,如果我運行此代碼裏面WebTestCase
但是,如果我寫了一個Symfony的控制檯命令(ContainerAwareCommand)中完全相同的代碼:
$em = $this->getContainer()->get('doctrine')->getManager();
var_dump($em->getConnection()->isConnectedToMaster());
isConnectedToMaster()
返回true。這意味着主人被選爲默認。
我無法找到如何從控制檯命令停止作爲主控的默認連接。這意味着如果我想從控制檯運行一些非關鍵的,繁重的數據處理任務 - 它們都會擊中主控(壞)而不是其中一個奴隸(好)。
任何人都知道我可以如何讓Doctrine2在控制檯中默認使用slave?或者知道爲什麼總是默認主人?
回答:感謝nifr讓我走上了正確的道路 - 我發現我的問題是因爲我使用的是JMS \ JobQueueBundle(它將應用程序/控制檯所用的應用程序替換爲必須連接到MasterSlaveConnection以強制選擇「主人」的方式)。當我在app/console
註釋掉
use JMS\JobQueueBundle\Console\Application;
,從正確地在我的控制檯測試選擇。
感謝
我的觀點是,即使在一個「空」命令 - 即什麼也不做除了得到了EntityManager並詢問是否已連接到主設備或從一個命令 - 我發現它已經連接到主人。 – timbostop
您可以調試其中的一種'MasterSlaveConnection'方法,通過將斷點放入每個方法來調用。此外,您可能需要在構造函數中放置斷點以檢查連接是否正在初始化。很容易就可以在'app/console'的引導過程中執行這些方法之一。如果連接實際構建且沒有任何方法正在執行,則可能存在配置問題。 – nifr
你有任何提示在應用程序/控制檯中進行調試嗎?我很高興通過網絡界面調試(使用PHPStorm),但不是在控制檯中。 – timbostop