2012-04-16 46 views
5

我有以下的PHP腳本基本上連接到MongoDB的,寫一個文檔,然後關閉連接19000次:與MongoDB的連接沒有關閉時會發生什麼?

<?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(); 
} 
?> 

運行此腳本一次工作正常,但如果我幾秒鐘後運行該腳本,我得到'無法分配請求的地址'異常,這是可以理解的,因爲服務器系統可能用完了端口。

但是,如果我刪除$ con> close();我可以反覆運行該腳本,而不會對數據庫造成任何明顯的壓力。我假設這是因爲連接到數據庫是持久的,並重復使用腳本上的相同初始連接。

我想知道的是,如果20k +不同的用戶同時運行這個腳本的1個循環,那麼數據庫會發生什麼?例如可用連接是否會因爲每個用戶需要創建一個到數據庫的連接而用完?或者是否所有這些用戶都使用第一個用戶創建的相同初始連接?

回答

5

你不應該在每次迭代時調用 - > close()。如果調用close,則告訴驅動程序不要重用持久連接。如果在緊密的循環中運行此操作,則操作系統將耗盡所有要使用的端口,因爲它們都處於TIME_WAIT狀態。如果(沒有調用 - >關閉)你在一個像你的例子那樣的嚴密循環中運行「new Mongo」,驅動程序將而不是建立新的連接並重新使用已有的連接。

+0

感謝您的解釋! – 2012-04-16 14:19:42

0

你會得到一個致命的錯誤:

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用的MongoDB和默認配置。 MongoDB繼續運行,其他腳本繼續工作。也許你應該考慮使用諸如jobserver,gearman等東西。

相關問題