Как предотвратить фатальную ошибку размера памяти, допустимого PHP, из результата запроса? - PullRequest
1 голос
/ 07 октября 2011

У меня есть функция (торт) php, предназначенная для обновления записей в таблице MySQL;сначала он запускает запрос, чтобы получить все новые элементы начиная с $ lastImportDate, а затем выполняет циклическое выполнение различных действий с элементом, сохраняя элемент, сохраняя информацию, связанную с таблицей.

К сожалению, похоже, что он падаетпод избыточным весом одного конкретного запроса.Здесь есть 5917 (и, возможно, количество!) Записей для обновления.Функция проходит через некоторое время, но в конечном итоге умирает с ошибкой «Разрешенный объем памяти [много байтов] исчерпан».

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

Ответы [ 3 ]

1 голос
/ 07 октября 2011

Звучит так, будто вы сохраняете все записи в переменной. Попробуйте получить только идентификаторы, а затем перебирайте идентификаторы. Вы получаете каждую запись с помощью $ this-> Model-> findById ($ id) и выполняете свои действия с этой конкретной записью. Затем вы сохраняете эту запись и сбрасываете данные, таким образом, вы никогда не будете хранить много данных в переменных. Меня не удивляет, что вам не хватает памяти, если вы помещаете все в одну переменную.

Увеличение лимита памяти - просто плохое временное решение, представьте, что вам нужно обновить 100000 или более записей. В конце концов вы закончите.

0 голосов
/ 08 октября 2011

Я точно не знаю природу задачи, которую вам нужно выполнить.Если вам нужно обновлять записи с регулярным интервалом: создайте Cake Shell, поместите его в расписание cron (запускайте каждый час, если вам нужно).

Если вам нужно выполнять обновление каждый раз, когда вы выполняете импортв БД: вы можете попробовать loop{ get and process 100 records, repeat until done} Попробуйте максимально увеличить количество записей, которые вы можете обработать, прежде чем достигнете предела памяти.

0 голосов
/ 07 октября 2011

Вы всегда можете попробовать установить:

ini_set('memory_limit', '-1');

[ документы ]

или более подходящее значение

В качестве альтернативы можно перенести дополнительные сведения в SQL (используя CASE обновления или вложенные выбранные обновления) или настроить задание cron для запуска сценария с меньшими интервалами, пока обновление не будет выполнено. полный ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...