2013-05-23 3 views
1

На моем веб-приложение, с доктриной, я вдруг получаю сообщение об ошибке, как показано ниже:ошибка памяти Доктрина

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 72 bytes) in {path_to_doctrine}/Doctrine/DBAL/Types/DateTimeType.php on line 53

я не появлялся раньше. Кроме того, FYI, раздел, стоящий перед этой проблемой, содержит несколько тысяч строк данных и имеет отношения с другими объектами. Я просто не могу понять, в чем проблема с памятью.

Еще одна интересная вещь: ошибка не выбрасывается из «DateTimeType.php» всегда, что-то вроде того, что я получил ее на «UnitOfwork.php» и некоторых других файлах.

Может кто-нибудь помочь мне, что я могу сделать, чтобы разрешить эту ошибку, пожалуйста?

My environment is: Ubuntu, Amazon EC2 micro instance, сервер базы данных 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')); 

Entity Класс:

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

Сколько строк вы извлечение в один присест? Можем ли мы увидеть соответствующий блок кода? – halfer

ответ

0

Как вы говорите о нескольких тысячах строк данных , вполне возможно, что вы (в прошлые дни просмотра/месяцы) были точно ниже этого предела, и теперь это время продолжалось, и данные росли, он достиг предела.

Есть ли способ уменьшить данные, которые вам нужны в это время на PHP? Не знаю, действительно ли вы нужны все эти тысячи строк в то время ... Доктрина способна наполнить как ленивую загрузку - при необходимости загружать данные, чтобы как можно меньше сохранить размер памяти.

Если вы думаете о превышении лимита памяти, убедитесь, что он достаточно велик для управления входящими данными, по крайней мере, в следующие месяцы. Drupal указал на некоторые способы превзойти это значение, даже если у вас нет доступа к файлу php.ini: http://drupal.org/node/207036

Я думаю, вы должны просмотреть свой код и обсудить его с экспертом по доктрине или опубликовать его здесь, поэтому эксперт может помочь вам.

1

Это поможет увидеть запрос, который извлекает записи. Как вы увлажняете результаты? Если вам не нужны результаты как объекты, вы можете убрать их в виде массива (см. Этот [SO ответ]: Doctrine2...Best hydration mode?

Если вам не нужны результаты все сразу, вы можете получать и обрабатывать их последовательно

В Доктрине есть опция «ДОПОЛНИТЕЛЬНАЯ ЛАЗОВАЯ ЗАГРУЗКА» (начиная с версии 2.1), описанные в руководстве manual как:

In many cases associations between entities can get pretty large. Even in a simple scenario like a blog. where posts can be commented, you always have to assume that a post draws hundrets of comments. In Doctrine 2.0 if you accessed an association it would always get loaded completly into memory. This can lead to pretty serious performance problems, if your associations contain several hundrets or thousands of entities.

Если вы пытаетесь вывести результат запроса (т.е. var_dump, print_r), память будет исчерпан даже на гораздо меньшие наборы данных.

+0

Привет, я отредактировал основное описание вопроса, надеюсь, что это даст некоторые из ваших ответов. Да, я использую «лишнюю ленивую загрузку» в ассоциации. Кроме того, поиск осуществляется через диапазон, как вы можете видеть выше. Вот почему я более смущен тем, что может быть неправильным. – Rana

+0

Можно ли увидеть класс сущности? – vstrackovski

+0

ОК, конечно. Просто отредактировал описание вопроса с помощью кода класса сущности. Благодарю. – Rana

-2

Вы могли бы попытаться увеличить объем памяти в PHP вянут в php.ini или непосредственно перед вызовом:

ini_set('memory_limit', '150M'); 
+1

Привет, спасибо. Тем не менее, я искал решение уровня кода. Думаю, это временное решение. из-за моей неправильной реализации, мне может понадобиться увеличить объем памяти в ближайшее время. Я просто хочу этого избежать, поскольку сервер, который я использую, представляет собой экземпляр AWS micro (с примерно 600 МБ памяти), и будет и другое приложение. Кроме того, это приложение только в версии для разработки и его необычном, что 30k данные должны будут занять такое огромное пространство в памяти. – Rana

+0

Не могли ли вы оставить комментарий, пожалуйста, спасибо. – Oli

Смежные вопросы