在我使用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的数据。
答案 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
我认为您应该检查您的代码并与学说专家讨论,或在此发布,以便专家可以帮助您。