2012-04-16 16 views
5

Mam następujący skrypt PHP, który w zasadzie łączy się z MongoDB, pisze dokument, a następnie zamyka połączenie 19000 razy:Co dzieje się, gdy połączenia z MongoDB nie są zamknięte?

<?php 
for($i=0; $i < 19000; $i++) { 
    $con = new Mongo("mongodb://localhost:27017"); 
    $db = $con->selectDB('test'); 

    $col = $db->selectCollection('close_wait_test'); 
    $col->insert(array('Test' => 'Value1')); 

    $con->close(); 
} 
?> 

Uruchomienie tego skryptu raz działa dobrze, ale jeśli uruchomić skrypt kilka sekund później Otrzymuję wyjątek "Nie mogę przypisać żądanego adresu", co jest zrozumiałe, ponieważ prawdopodobnie w systemie serwera zabrakło portów.

Jeśli jednak usunę $ CON> close(); Mogę uruchamiać ten skrypt w kółko bez wyraźnego obciążenia bazy danych. Zakładam, że dzieje się tak dlatego, że połączenie z bazą danych jest trwałe i używa tego samego początkowego połączenia w skrypcie.

Co chciałbym wiedzieć, to czy 20k + inni użytkownicy uruchomili 1 pętlę tego skryptu w tym samym czasie, co stałoby się z bazą danych? na przykład czy dostępne połączenia po prostu się wyczerpią, ponieważ każdy użytkownik musi utworzyć jedno połączenie z bazą danych? lub czy wszyscy ci użytkownicy będą korzystali z tego samego połączenia początkowego stworzonego przez pierwszego użytkownika?

Odpowiedz

5

Nie powinieneś wywoływać -> close() przy każdej iteracji. Jeśli zadzwonisz blisko, powiedz kierowcy, aby nie korzystał ponownie z trwałego połączenia. Jeśli uruchomisz to w ciasnej pętli, to systemowi zabraknie portów do użycia, ponieważ wszystkie są w stanie TIME_WAIT.

Sterownik PHP używa trwałych połączeń, a jeśli (bez wywoływania -> zamknij) uruchamiasz "nowe Mongo" w ciasnej pętli, jak w twoim przykładzie, sterownik wykona , a nie nawiąże nowe połączenia i ponownie użyje już istniejącego .

+0

Dzięki za wyjaśnienie! –

0

co można uzyskać błąd krytyczny:

PHP Fatal error: Uncaught exception 'MongoConnectionException' with message 'Cannot assign requested address' in /home/pierre/test.php:3 Stack trace: #0 /root/test.php(3): Mongo->__construct('mongodb://local...') #1 {main} thrown in /home/pierre/test.php on line 3

c=0; while [ $c -le 20000 ]; do php test.php; c=$[c+1]; done

testet z MongoDB i domyślnej konfiguracji. MongoDB działa, a inne skrypty wciąż wykonują swoją pracę. Może powinieneś rozważyć użycie czegoś takiego jak jobserver, na przykład gearman.