CakePHP error Допустимый объем памяти исчерпан - PullRequest
0 голосов
/ 26 июня 2011

В одном из моих PHP-приложений я получаю ошибку «Разрешенный размер памяти исчерпан».

Что я сделал не так, чтобы получить эту ошибку?

Она отображается на страницах, где я использую более-менее обычноМетоды CakePHP, такие как 'find', для выбора записи из таблицы базы данных на страницах индекса (списка).

Как это исправить?проблема в том, что я не могу установить размер памяти на коммерческих серверах ....

Заранее спасибо!

Ответы [ 5 ]

2 голосов
/ 29 июня 2011

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

1 голос
/ 25 июля 2012

Есть и другие проблемы, которые могут привести к этой ошибке.

Например, бесконечный цикл, как я только что реализовал непреднамеренно.

Я хотел, чтобы приложение отображало ajax-представление для каждого json-вызова, и я закончил с этим в контроллере приложения:

function beforeRender() {

    parent::beforeRender();

     if ($this->params['ext'] == 'json') {

       $this->render('Elements/json');

    }

}

, который, кажется, возвращается к методу beforeRender.

Может быть, это поможет кому-то, кто проходит через ту же проблему.

1 голос
/ 27 июня 2011

Как предложил Стоик, вы можете увеличить предел памяти в своем файле .htaccess, но вам действительно следует постараться выяснить, почему это происходит, потому что даже ограничения памяти по умолчанию должно быть достаточно для большинства малых и средних приложений и базы данных и чем выше вы увеличиваете лимит памяти, тем скорее вам придется обновить свой хостинг-план.

Использование инструмента проверки памяти, как предложил Альфред, было бы одним из вариантов, но если ваше приложение достаточно простое, а действие, на котором оно не выполняется, не так уж сложно, вы можете искать контрольные знаки в своем коде вручную. Для начала у вас есть рекурсивный набор 2 где-нибудь вокруг вашего find? Если это так, попробуйте временно изменить его на -1. Если нет, вы можете добавить $this->Model->recursive = -1; перед вашим find, чтобы убедиться, что он установлен.

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

0 голосов
/ 26 июня 2011

Вы можете использовать что-то вроде следующего в вашем .htaccess файле:

php_value memory_limit 16M

Это должно помочь вам установить предел памяти, не возиться с вашим файлом PHP INI.:))
Убедитесь, что это первая строка в вашем файле .htaccess, обычно ..

0 голосов
/ 26 июня 2011

Может быть, вы можете проверить использование памяти с помощью такого инструмента, как xdebug .Затем вы должны попытаться оптимизировать эту часть (и только эту часть => нет преждевременной оптимизации).

...