對於我們的服務器堆棧的相關部分,我們正在運行: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);
}
感謝您的信息,我打算目前關閉永久連接。我不認爲問題已經解決,但如果沒有其他問題出現,我會回來標記你的答案。 – Brendan
我打算標記你的答案是正確的,因爲看起來這隻能在驅動程序更新之前無法真正解決。感謝您讓球滾動。我用我的解決方法更新了我的問題。 – Brendan
對我來說,同樣的事情,感謝信息,花了我2個小時弄清楚Mongo服務器已關閉,沒有任何內容在php-fpm日誌中;-(現在已經安裝了一個nagios腳本 –