教义记忆错误

时间:2013-05-23 07:38:10

标签: php doctrine-orm

在我使用Doctrine的Web应用程序中,我突然收到如下错误:

  

致命错误:第53行的{path_to_doctrine} /Doctrine/DBAL/Types/DateTimeType.php中允许的内存大小为134217728个字节(试图分配72个字节)

我之前没有露面。此外,仅供参考,面向此问题的部分有数千个数据行,并且与其他实体有关系。我只是无法理解它可能存在的内存问题。

另一个有趣的事情是,错误不是总是从'DateTimeType.php'抛出,我在'UnitOfwork.php'和其他一些文件上也得到了它。

有人可以帮助我解决这个错误吗?

我的环境是: Ubuntu,Amazon EC2微实例,RDS数据库服务器,PHP 5.3。

Code For data retrieval:
/**
     * Return list of recors according to given start index and length
     * @param type $start the start index number for the city list
     * @param type $length Determines how many records to fetch
     * @return type 
     */
    function get_by_range($start=1,$length=10,$criteria = array(),$orderBy = NULL)
    {
        try
        {
            return $this->em->getRepository($this->entity)->findBy($criteria, $orderBy, $length, $start);
        }
        catch(Exception $err)
        {
            log_message("error", $err->getMessage(), false);
            print_r($err->getMessage());exit();
            return NULL;
        }
    }

正在调用它来填充主列表:

$this->data["joblist"]            =   $this->jobmodel->get_by_range((($page-1)*$pagingConfig['per_page']),$pagingConfig['per_page'],array("site"=>  "test"), array('postTime' => 'DESC'));

实体类:

use Doctrine\ORM\Mapping as ORM;

/**
 * PdJobs
 *
 * @Table(name="pd_jobs")
 * @Entity
 */
class PdJobs
{
    /**
     * @var integer $id
     *
     * @Column(name="id", type="bigint", nullable=false)
     * @Id
     * @GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var string $projectId
     *
     * @Column(name="project_id", type="string", nullable=false, unique=true)
     */
    private $projectId;

    /**
     * @var string $title
     *
     * @Column(name="title", type="string", length=255, nullable=false)
     */
    private $title;

    /**
     * @var string $url
     *
     * @Column(name="url", type="string", length=255, nullable=false)
     */
    private $url;

    /**
     * @var string $shortDescription
     *
     * @Column(name="short_description", type="string", length=255, nullable=false)
     */
    private $shortDescription;

    /**
     * @var string $site
     *
     * @Column(name="site", type="string", length=255, nullable=false)
     */
    private $site;

    /**
     * @var datetime $postTime
     *
     * @Column(name="post_time", type="datetime", nullable=false)
     */
    private $postTime;

    /**
     * @var \Doctrine\Common\Collections\ArrayCollection
     * @ManyToMany(targetEntity="PdExpertises", inversedBy="jobs", fetch="EXTRA_LAZY")
     * @JoinTable(name="pd_jobs_expertises")
     */
    private $expertises;

    /**
     * @var string $type
     *
     * @Column(name="type", type="string", nullable=true)
     */
    private $type;

    /**
     * @var string $description
     *
     * @Column(name="description", type="string", length=1000, nullable=true)
     */
    private $description;

    /**
     * @var string $budget
     *
     * @Column(name="budget", type="string", length=255, nullable=true)
     */
    private $budget;

    /**
     * @var string $skill
     *
     * @Column(name="skill", type="string", length=255, nullable=true)
     */
    private $skill;

    /**
     * @var integer $candidates
     *
     * @Column(name="candidates", type="integer", options={"default":0},nullable=true)
     */
    private $candidates;

    /**
     * @var string $averageAmount
     *
     * @Column(name="average_amount", type="string", length=255, nullable=true)
     */
    private $averageAmount;

    /**
     * @var datetime $startDate
     *
     * @Column(name="start_date", type="date", nullable=true)
     */
    private $startDate;

    /**
     * @var datetime $endDate
     *
     * @Column(name="end_date", type="date", nullable=true)
     */
    private $endDate;

    /**
     * @var string $category
     *
     * @Column(name="category", type="string", length=255, nullable=true)
     */
    private $category;/**
     * @var string $subCategory
     *
     * @Column(name="sub_category", type="string", length=255, nullable=true)
     */
    private $subCategory;

    /**
     * @var string $clientCountry
     *
     * @Column(name="client_country", type="string", length=255, nullable=true)
     */
    private $clientCountry;

    /**
     * @var string $clientRating
     *
     * @Column(name="client_rating", type="string", length=255, nullable=true)
     */
    private $clientRating;

每页最多检索25行。所以我在想可能不是问题吗?在外键关系的情况下,我也有“fetch =”EXTRA_LAZY“。所以,我希望这部分也是安全的吗?

然而,我在想另一点,我的主键列'id'是'整数'类型,它可能是问题吗?但是,错误并未特别指出此错误。另外,为了澄清,我总共有大约30k的数据。

2 个答案:

答案 0 :(得分:1)

查看检索记录的查询会有所帮助。你如何保湿结果集?如果您不需要将结果作为对象,您可以将它们水合成一个数组(参见[SO答案]:Doctrine2...Best hydration mode?

如果您不需要同时获得结果,则可以按顺序检索和处理它们。

在Doctrine(从2.1版开始)中还有一个“EXTRA LAZY LOADING”选项,在manual手册中描述为:

  

在许多情况下,实体之间的关联可能会变得非常大。甚至在像博客这样的简单场景中。如果帖子可以评论,你总是要假设一个帖子绘制了评论的内容。在Doctrine 2.0中,如果您访问了一个关联,它将始终以完整的方式加载到内存中。如果您的关联包含多个hundrets或数千个实体,这可能会导致严重的性能问题。

如果您尝试输出查询结果(即var_dump,print_r),即使在更小的数据集上,内存也会耗尽。

答案 1 :(得分:0)

当你谈论成千上万的数据行时,很可能是你(在过去的观看日/月)完全低于这个限制,现在,时间继续,数据正在增长,它达到了极限。

有没有办法在PHP中减少当时所需的数据?不知道你当时是否真的需要那些数千行... Doctrine能够像延迟加载一样 - 只在需要时加载数据 - 以尽可能降低内存占用量。

如果您考虑超出内存限制,请确保它足以管理传入数据,至少在接下来的几个月内。 Drupal指出了一些超出此值的方法,即使您无权访问php.ini文件:http://drupal.org/node/207036

我认为您应该检查您的代码并与学说专家讨论,或在此发布,以便专家可以帮助您。