2013-03-12 32 views
2

在此先感謝您的幫助。ZF2 + Doctrine2:服務器已經消失 - 如何慢跑舊連接?

我想知道如果有人很快知道什麼函數調用實體庫來緩慢重新連接,如果它是死的。我正在運行一些可能需要超過wait_timeout的時間(通過ZF2 CLI路由)的一些作業,不幸的是,ER的連接在需要使用時(作業完成時)就會消亡。

極品:

// do the long job 

$sl = $this->getServiceLocator(); 
$mapper = $sl->get('doctrine_object_mapper'); 
if(!$mapper->getRepository()->isAlive()) // something like so 
    $mapper->getRepository()->wakeTheHellUp(); 

不是那些正確的方法名! ;)

再次感謝。

回答

5

這是一個fairly common problem長時間運行的進程和連接。

解決方案是檢索ORM的DBAL connection並在連接丟失時重新創建它(確保它在事務期間不會死亡)。這顯然是煩人,但它現在這樣做的唯一方法:

// note - you need a ServiceManager here, not just a generic service locator 
$entityMAnager = $serviceManager->get('entity_manager'); 
$connection = $entityManager->getConnection(); 

try { 
    // dummy query 
    $connection->query('SELECT 1'); 
} catch (\Doctrine\DBAL\DBALException $e) { 
    if ($connection->getTransactionIsolation()) { 
     // failed in the middle of a transaction - this is serious! 
     throw $e; 
    } 

    // force instantiation of a new entity manager 
    $entityManager = $serviceManager->create('entity_manager'); 
} 

$this->doFoo($entityManager); 
+0

感謝Ocramius。我想我必須重構使用長期服務的工廠才能讓SM進入。現在,我通過實現ServiceLocatorAwareInterface將SL放入,並在module.config.php中將其聲明爲一個Invokable。我會給它一個鏡頭併發回。非常感謝。 – Saeven 2013-03-13 03:28:05

+0

@Saeven主服務經理實際上是一個服務定位器。雖然你*可以*現在直接使用它,我建議有正確的類型暗示,以避免在未來的問題:) – Ocramius 2013-03-13 09:53:06

+1

作爲後續問題,我昨天才解決 - 這是一個小寫,可能有幫助。源文件,解釋,以及爲什麼奧克拉米烏斯的帖子是一個墊腳石。值得稱讚的是,他實際上通過IRC引導我走向最後的方向。 http://circlical.com/blog/2013/9/12/mysql-server-has-gone-away-atop-doctrine2-and-zend-framework-2 – Saeven 2013-09-13 12:37:11