2012-04-16 49 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等东西。

相关问题