当前位置: 首页 > 知识库问答 >
问题:

Zend框架2教义MongoDB ODM和Apache太慢

商风华
2023-03-14

我们在运行时遇到了奇怪的性能问题:

  • Zend框架2.3.3关于PHP 5.5.18-1
  • Doctrine MongoDB ODM模块(https://github.com/doctrine/mongodb,https://github.com/doctrine/DoctrineMongoODMModule)
  • Ubuntu 12.04在VirtualBox通过流浪(https://vagrantcloud.com/hashicorp/boxes/precise64)

我们确信这不是一个DB问题(用一个真实的MongoDB实例进行了尝试,结果仍然相同)。

我们以类似于以下方式定义了与Doctrine ODM一起工作的对象:

<?php

namespace CatalogueManager\Document;

use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
use Doctrine\Common\Collections\ArrayCollection;

/*
 * @ODM\Document(repositoryClass="CatalogueManager\Repository\ProductRepository")
 */
class Item
{
    /** @ODM\Id */
    protected $id;

    /** @ODM\String */
    protected $name;

    /** @ODM\Timestamp */
    protected $created;

    /** @ODM\Timestamp */
    protected $updated;

    // ---------------------------------------------------------------------- //

    /**
     * Return properties as an array. Helper method to assist with converting
     * doctrine objects to arrays so we can return front-end api calls as json.
     *
     * Required as currently Doctrine ODM do not support array hydration of
     * referenced documents.
     *
     * @access public
     * @return array
     *
     */
    public function toArray()
    {
        $arr = ['id'          => $this->id,
                'name'        => $this->name,
                'urlSlug'     => $this->urlSlug,
                'desc'        => $this->desc,
                'metaData'    => $this->metadata,
                'category'    => $this->category,
                'brand'       => $this->brand,
                'assets'      => $this->assets,
                'shipping'    => $this->shipping,
                'specs'       => $this->specs,
                'attrs'       => $this->attrs,
                'optionTypes' => $this->optionTypes
                ];

        return $arr;
    }

    // ---------------------------------------------------------------------- //

    /**
     * Getter
     *
     * @access public
     * @return string
     *
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Getter
     *
     * @access public
     * @return string
     *
     */
    public function getName()
    {
        return $this->name;
    }

    // ---------------------------------------------------------------------- //

    /**
     * Setter
     *
     * @param string $value Property value
     *
     * @access public
     * @return void
     *
     */
    public function setName($value)
    {
        $this->name = $value;
    }

}

我们使用这些工具将大约100种产品导入到产品数据库中。在真正的机器上,这一切大约需要5秒钟,但在虚拟机上进行尝试时,同样的操作大约需要25秒钟。

看起来问题可能出在Apache上,它在处理这一切时占用了99%的负载,但我很难确定到底发生了什么。

任何形式的建议都将不胜感激。。。

这似乎只在写入数据时发生。读取数据似乎还可以。

Webgrind数据(截图)可用:https://www.dropbox.com/s/jjlg7ano6epy6t1/webgrind.png?dl=0

共有2个答案

司马羽
2023-03-14

所以这不是答案,我的目标是建议。在本地机器上运行较慢是正常的,更不用说在虚拟机器上了。

可能会有所帮助的事情:

  1. 您可以通过将其添加到vagrant文件中,使虚拟机拥有更多内存

config.vm.providerVirtualbox do|v|v.customize[]end

还有一个旁注。为什么在12.04版本上运行PHP5.5,为什么不是14.04版本(它更可靠,但不那么精确)。设置起来比较容易。

姚向晨
2023-03-14

在看了一些XDebug数据的屏幕截图后,我认为您只是以错误的方式使用了ORM/ODM,因为您正在批次处理作业

这种操作的正确解决方案http://doctrine-orm.readthedocs.org/en/latest/reference/batch-processing.html

发生的事情非常简单:-ODM从DB加载一条记录-ODM将该记录存储到UnitOfWork-刷新时,ODM迭代UnitOfWork中的所有条目,查找更改的文档/实体

如果您在工作单元中继续存储更多数据,那么很明显,每次重复操作时,迭代将花费更长的时间。

您应该在正在处理的批处理块之间调用ObjectManager#clear()

 类似资料:
  • 目前我尝试使用Zend Framework 2的CSRF保护。 但每次我发送表单时,都会收到以下错误消息: 提交的表格不是来自预期的网站 我以这种方式实施了CSRF保护: 1)创建了一个Form Class并添加了csrf: 2)在view文件中呼应csrf元素: 我发现csrf令牌没有存储在会话中,但是为什么呢?

  • 在Zf3项目中,我添加了条令和迁移模块,并配置了条令和迁移配置。 现在我通过以下命令创建迁移 有人帮我吗有什么问题吗?

  • 您好,我遵循了Zend framework 3的入门教程,并设法使其正常工作。因此,我决定下载一个新的框架应用程序,并像在线商店一样对其进行调整。但是当我去运行模块时。php文件通过wamp我收到以下错误消息: 致命错误:在C:\wamp64\www\shop\module\shop\src\module中找不到接口“Zend\ModuleManager\Feature\ConfigProvide

  • 问题内容: 有没有一种方法可以在Zend Framework中将SQL字符串作为查询执行? 我有一个像这样的字符串: 现在,我想直接执行此字符串,然后对其进行解析并“手动” 创建一个对象。或者,如果可能的话,从此字符串创建一个对象,以执行该对象。 我怎样才能做到这一点?我在Zend文档中找不到解决方案。 问题答案: 如果要在一开始创建Zend_DB对象,则可以使用该对象创建查询。请查看手册中的以下

  • Apache Struts 2 是一个简洁的,可扩展的框架,它用来创建企业级的 Java web 应用程序。框架的目的是随着时间的积累从构建,部署,维护应用程序上简化整个开发周期。Apache Struts 2 最初被称为 WebWork 2。

  • 问题内容: 我遇到了一个可能非常简单的问题,在《 Zend Framework手册》或其他地方找不到令人满意的(主观上可以看到的)答案… 我有很多方法可以将php变量移交给我的sql查询,以致于我失去了概述,并且可能我对一般的引用缺乏一些了解。 准备的陈述 我知道,使用此解决方案,我不需要引用任何内容,因为数据库会为我处理此问题。 通过API查询Zend_Db_Table和_Row对象 $ use