На одном из моих PHP-приложений я получаю ошибку «Разрешенная память».
Что я сделал неправильно, чтобы получить эту ошибку?
Он отображается на страницах, где я использую более-менее обычные методы cakephp, такие как «найти», выбрать запись из таблицы базы данных на страницах индекса (списка).
Как я могу это исправить? проблема в том, что я не могу установить размер памяти на коммерческих серверах ….
Заранее спасибо!
Изучите поведение «Containable» для ваших моделей. Это основное поведение, и кажется, что вам нужно добавить его в свои находки, чтобы ограничить объем данных, которые они оттягивают. Кроме того, начните искать замену находок с помощью пользовательских запросов, чтобы ускорить процесс и еще больше ограничить объем возвращаемых данных.
Как предположил Стоик, вы можете увеличить лимит памяти в вашем файле .htaccess, но вы должны действительно попытаться выяснить, почему именно это происходит, потому что даже ограничение по умолчанию для памяти должно быть достаточным для большинства приложений и баз данных малого и среднего размера и Чем выше вы увеличиваете лимит памяти, тем скорее вам придется обновить свой план хостинга.
Использование инструмента проверки памяти, предложенного Альфредом, будет одним из вариантов, но если приложение достаточно обоснованное, и действие, которое он не выполняет, не так сложно, вы можете искать контрольные знаки в своем коде вручную. Начнем с того, что у вас есть рекурсивный набор в 2 вокруг вашей find
? Если это так, попробуйте временно изменить его на -1
. Если нет, вы можете добавить $this->Model->recursive = -1;
перед find
чтобы убедиться, что он установлен.
Разумеется, запрос может завершиться неудачно, если вы это сделаете, но по крайней мере тогда вы узнаете, что ел всю память. Затем вы могли бы рассмотреть более эффективный пользовательский запрос вместо автомата Cake, который часто экономит огромное количество накладных расходов, особенно на сложные запросы, основанные на многоуровневых ассоциациях моделей.
Существуют и другие проблемы, которые могут привести к этой ошибке.
Например, бесконечный цикл, например, я только что реализовал непреднамеренно.
Я хотел, чтобы приложение отображало ajax-view для каждого json-вызова, и я закончил с ним в App-приложении:
function beforeRender() { parent::beforeRender(); if ($this->params['ext'] == 'json') { $this->render('Elements/json'); } }
который, кажется, неоднократно возвращается к методу beforeRender.
Возможно, это помогает кому-то, кто переживает ту же проблему.
Возможно, вы можете проверить использование памяти с помощью инструмента, такого как xdebug . Затем вы должны попытаться оптимизировать эту часть (и только эта часть => не досрочная оптимизация).
В файле .htaccess
вы можете использовать что-то вроде следующего:
php_value memory_limit 16M
Это должно помочь вам установить ограничение памяти без использования вашего PHP INI-файла. :))
Убедитесь, что это первая строка в файле .htaccess
.