在PHP中打开和关闭16000个Mongo数据库实例

Chr*_*rce 8 php mongodb nosql

我目前正在进行一些个人测试和基准测试,以比较使用MongoDB和MySQL与真实世界示例数据之间的工作流程和效率.

为了在每个数据库中设置我的数据,我正在做几千个循环并随机创建数据对象以插入到数据库中.

但是我在PHP中使用Mongo类时遇到了一些问题,我无法解决.问题是这样的:

I have a loop which creates a new Mongo instance and connection, inserts a small array into a collection and then closes the connection. This loop should run 20000 times. However it is always failing around the 16300nd loop (with a min of 16200 and max of 16350 I'd say after a few runs) when it attempts to create the instance/make a connection.

The code in the loop is below:

$data = get_random_user_data();

$mongo = new Mongo('mongodb://admin:password@localhost:27017/test');

    if ($mongo->test->users->insert($data)) {
        $users[] = array('id' => $data['_id'], 'name' => $data['username']);
    echo $i." - Added user: ".$data['username'].'<br/>';
    }

$mongo->close();
Run Code Online (Sandbox Code Playgroud)

get_random_user_data() just returns a simple associative array.

The error I get is:

Fatal error: Uncaught exception 'MongoConnectionException' with message 'Unknown error'
Run Code Online (Sandbox Code Playgroud)

On the line:

$mongo = new Mongo('mongodb://admin:password@localhost:27017/test');
Run Code Online (Sandbox Code Playgroud)

Any ideas? Is there something fundamental I am missing like some security or spam-prevention?

Thanks in advance.

Extra info:

脚本在大约114.9797秒死亡.这不是一个PHP内存或基于时间的问题,因为提出了所有限制,我运行我的MySQL基准测试昨天插入120000行(使用相同的方法循环打开连接,插入,关闭连接)大约一个小时没有问题.

运行PHP 5.3.5版

phpinfo Mongo信息:

MongoDB Support enabled
Version 1.2.0-
Directive   Local Value Master Value
mongo.allow_empty_keys  0   0
mongo.allow_persistent  1   1
mongo.auto_reconnect    1   1
mongo.chunk_size    262144  262144
mongo.cmd   $   $
mongo.default_host  localhost   localhost
mongo.default_port  27017   27017
mongo.long_as_object    0   0
mongo.native_long   0   0
mongo.no_id 0   0
mongo.utf8  1   1
Run Code Online (Sandbox Code Playgroud)

kri*_*ina 6

您的操作系统只有有限数量的插槽才能打开.当你打开一个套接字然后关闭它时,操作系统不会立即将它放回"可用"池中,它在"等待时间"状态下暂停一段时间,Nat 在他的回答中提到.

您可以增加操作系统将打开的套接字数量,请参阅http://www.mongodb.org/display/DOCS/Too+Many+Open+Files(每个套接字都是一个打开的"文件").

此外,您使用的是旧版本的驱动程序,您可能需要考虑升级.