2014-08-12 6 views
5

После перезапуска службы mongod я получаю ошибку соединения для каждой базы данных, когда я пытаюсь соединиться с PHP:MongoDB «Удаленный сервер закрыл соединение» на первом подключении после перезагрузки

Failed to connect to: localhost:27017: Remote server has closed the connection 
500 Internal Server Error - MongoConnectionException 

После одного или двух снова восстанавливает соединение. Он не против, если соединение выполняется сразу после перезапуска или через некоторое время.

MongoDB version: 2.6.4 
PHP MongoDB driver version: 1.5.5 
Configuration: PHP-FPM with Apache2 

Я думаю, что постоянные подключения старого экземпляра Монго используется, но я не могу узнать, как это исправить. Есть ли способ заставить монгольского водителя начать новое соединение, когда первое не удастся?

ответ

4

Была такая же проблема. Я могу подтвердить, что он связан с пулом соединений в драйвере, и я не нашел ценного варианта. Я также могу подтвердить, что это происходит для первых новых запросов MongoClient() через несколько часов после перезапуска db.

То, что я сделал, - это окружить мой новый MongoClient() с помощью try catch и повторить его. . что-то вроде этого:

try { 
    $NoSQLDBMS_Connection = new MongoClient($NoSQLDBMS_Host); 
    $NoSQLDBMS_Database = $NoSQLDBMS_Connection->selectDB($NoSQLDBMS_DBName); 
} catch(Exception $e) { 
    // retry, mostly when mongodb has been restarted in order to get a new connection 
    $MaxRetries = 5; 
    for($Counts = 1; $Counts <= $MaxRetries; $Counts ++) { 
     try { 
      $NoSQLDBMS_Connection = new MongoClient($NoSQLDBMS_Host); 
      $NoSQLDBMS_Database = $NoSQLDBMS_Connection->selectDB($NoSQLDBMS_DBName); 
     } catch(Exception $e) { 
      continue; 
     } 
     return; 
    } 
    // do something fancy here if mongodb is not reachable at all 
} 

Retrying to max. 5 раз - это просто паранойя. Я никогда не испытывал того, что когда-либо понадобилось больше одной попытки.

Надеюсь, это поможет.

18

Решение, которое мы теперь используем, заключается в том, что мы перезапускаем Apache после перезапуска MongoDB. Не лучшее решение, но оно работает :).

+0

WTF действительно работает! – simPod

Смежные вопросы