2

在我使用 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' 的类型是 'integer' ,这可能是问题吗?但是,错误并没有具体指向此错误。另外,澄清一下,我总共有大约 30k 数据。

4

2 回答 2

1

这将有助于查看检索记录的查询。您如何为结果集补充水分?如果您不需要将结果作为对象,则可以将它们作为数组进行水合(请参阅此 [SO answer]:Doctrine2...Best hydration mode?

如果您不需要一次全部的结果,您可以按顺序检索和处理它们。

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

在许多情况下,实体之间的关联会变得非常大。即使在像博客这样的简单场景中。在可以评论帖子的地方,您总是必须假设帖子吸引了数百条评论。在 Doctrine 2.0 中,如果您访问一个关联,它总是会完全加载到内存中。如果您的关联包含数百或数千个实体,这可能会导致非常严重的性能问题。

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

于 2013-05-23T08:20:38.253 回答
0

当您谈论数千个数据行时,很可能您(在过去的查看天数/月数)正好低于此限制,而现在,随着时间的推移,数据不断增长,它达到了限制.

有没有办法在 PHP 中减少你当时需要的数据?不知道当时您是否真的需要所有这些数千行... Doctrine 能够进行延迟加载(仅在需要时加载数据)之类的东西,以保持内存占用尽可能低。

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

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

于 2013-05-23T07:58:57.250 回答