2012-09-14 24 views
1

對於我們的服務器堆棧的相關部分,我們正在運行:PHP-FPM進程持有到MongoDB的連接狀態

  • NGINX 1.2.3
  • PHP-FPM 5.3.10與PECL蒙戈1.2。 12
  • 的MongoDB 2.0.7
  • 的CentOS 6.2

我們得到一些奇怪,但可預見的行爲,當MongoDB服務器消失(崩潰,就會被殺死,E TC)。即使周圍的連接代碼try/catch塊,即:

try 
{ 
    $mdb = new Mongo('mongodb://localhost:27017'); 
} 
catch (MongoConnectionException $e) 
{ 
    die($e->getMessage()); 
} 

$db = $mdb->selectDB('collection_name'); 

取決於哪個PHP-FPM工人已經連接到已經蒙戈,連接狀態進行緩存,造成進一步的例外走未處理的,因爲$mdb連接處理程序不能使用。令人不安的是try並不總是會在相當長的時間內失效,直到15分鐘後,當我假設--php-fpm進程死亡/重生時。

從本質上講,行爲是當你點擊一個還沒有連接到mongo的工作者時,你會得到上面的死信息,並且當你連接到一個工作者時,你會得到一個未處理的異常$mdb->selectDB('collection_name');,因爲catch不運行。

當PHP是一個單獨的進程時,即通過mod_php通過Apache,這種行爲不會發生。只是爲了後代,回到Apache/mod_php目前不是我們的選擇。

有沒有辦法解決這個問題?我不希望連接狀態在不同的php-fpm進程之間不一致。

編輯: 雖然我等待要固定在這方面的驅動程序,我目前的解決方法是做一個快速的查詢,以確定驅動程序可以處理請求,然後加載或沒有加載的MongoDB庫/運行查詢,如果它不能連接/查詢:

try 
{ 
    // connect 
    $mongo = new Mongo("mongodb://localhost:27017"); 

    // try to do anything with connection handle 
    try 
    { 
     $mongo->YOUR_DB->YOUR_COLLECTION->findOne(); 
     $mongo->close(); 
     define('MONGO_STATE', TRUE); 
    } 
    catch(MongoCursorException $e) 
    { 
     $mongo->close(); 
     error_log('Error connecting to MongoDB: ' . $e->getMessage()); 
     define('MONGO_STATE', FALSE); 
    } 
} 
catch(MongoConnectionException $e) 
{ 
    error_log('Error connecting to MongoDB: ' . $e->getMessage()); 
    define('MONGO_STATE', FALSE); 
} 

回答

2

的PHP蒙戈驅動器連接代碼越來越大檢修的1.3版本,目前在β2寫這篇文章。根據您的描述,您的問題可能會被修復解決:

https://jira.mongodb.org/browse/PHP-158

https://jira.mongodb.org/browse/PHP-465

一旦被釋放,你將能夠看到修復的完整列表在這裏:

https://jira.mongodb.org/browse/PHP/fixforversion/10499

或者,或者在PECL site上。如果您可以測試1.3並確認您的問題仍然存在,那麼我確信驅動程序開發人員會很樂意在1.3.0發佈之前收到您的回覆,特別是在易於重現的情況下。

+0

感謝您的信息,我打算目前關閉永久連接。我不認爲問題已經解決,但如果沒有其他問題出現,我會回來標記你的答案。 – Brendan

+1

我打算標記你的答案是正確的,因爲看起來這隻能在驅動程序更新之前無法真正解決。感謝您讓球滾動。我用我的解決方法更新了我的問題。 – Brendan

+0

對我來說,同樣的事情,感謝信息,花了我2​​個小時弄清楚Mongo服務器已關閉,沒有任何內容在php-fpm日誌中;-(現在已經安裝了一個nagios腳本 –