PHP和MongoDB严重缓慢(15秒)

时间:2012-08-28 13:56:44

标签: php mongodb

我设置了Mongo,一切都很棒。当我使用MongoVUE或shell时,一切都像闪电一样快。

在安装适用于Windows的PHP Mongo驱动程序之后,每个查询最多需要15秒。即使PHP.net中的这个简单教程也需要15秒。

教程示例:

    $time_start = microtime(true);
    // connect
    $m = new Mongo();

    // select a database
    $db = $m->comedy;

    // select a collection (analogous to a relational database's table)
    $collection = $db->cartoons;

    // add a record
    $obj = array( "title" => "Calvin and Hobbes", "author" => "Bill Watterson" );
    $collection->insert($obj);

    // add another record, with a different "shape"
    $obj = array( "title" => "XKCD", "online" => true );
    $collection->insert($obj);

    // find everything in the collection
    $cursor = $collection->find();

    // iterate through the results
    foreach ($cursor as $obj) {
        echo $obj["title"] . "\n";
    }
    $time_end = microtime(true);
    $time = $time_end - $time_start;

    echo "\nOperation took $time seconds\n";

输出:

Calvin and Hobbes XKCD Operation took 15.000731945038 seconds

我正在使用Windows 7,WAMP,MongoDB 2.0.7和Windows PHP Mongo驱动程序(v1.1.12)from Github

回答评论中的问题:

问:您是否测试了系统上的其他PHP代码及其持续时间?
答:这实际上是一个较大的Web应用程序的一小部分,其他一切正常。我很乐意发布你认为有用的任何基准测试。

问:您是否在Mongo中分析了查询?
A:是的。如果我通过shell运行它,它会立即得到响应。

问:这是什么WAMP版本?
A: WampServer 2.2

问:这是什么PHP版本?
A: 5.3.13

问:mongodb已经有数据吗?
答:我在发布的基准测试之前删除了所有数据库,所以它所包含的全部内容都是下面代码插入的数据。

问:计算机的规格是什么(主要是内存)?
A: AMD Phenom II X4 840T 2.9GHz处理器,4GB DDR3内存,64位操作系统

2 个答案:

答案 0 :(得分:2)

我同意15秒是荒谬的。即使SafeMode打开,教程代码也应该接近0.5秒(如果是)。您可以通过插入代码看到SafeMode已关闭:

// add a record
$obj = array( "title" => "Calvin and Hobbes", "author" => "Bill Watterson" );
$collection->insert($obj);

// add another record, with a different "shape"
$obj = array( "title" => "XKCD", "online" => true );
$collection->insert($obj);

您正在执行异步插入,这意味着PHP代码不会等待从DB返回,因此理论上对DB的调用不应该是代码中的问题。

find()可能会导致问题,所以我会对此进行分析。

驱动程序仍有可能造成某种减速但这种可能性极小。为了进一步帮助我们:

  • 您是否测试了系统上的其他PHP代码及其持续时间?
  • 您是否在Mongo中分析了查询?
  • 这是什么WAMP版本?
  • 这是什么PHP版本?
  • mongod已经有数据吗?
  • 电脑的规格是什么(主要是内存)?

答案 1 :(得分:0)

插入 new 数据库需要一段时间,因为MongoDB需要先预先分配数据库文件。后续插入将很快。 除此之外:使用一个插入执行基准测试是没有意义的。