2010-09-16 4 views
0

Я запускаю PHP-скрипт (CLI) для вычисления большой вещи. Вероятно, это будет (почти) бесконечный цикл, но после 17000 запусков у меня заканчивается память. Могу ли я каким-то образом сбросить память (скажем, каждый 1000-й запуск), чтобы я мог продолжать работать навсегда?PHP segfaults in loop

/Max

+2

Что вы просматриваете, есть ли способ пакетной загрузки данных, чтобы вы не загружали все сразу? – joshtronic

+2

Вам действительно нужно показать код здесь –

+2

Если вы предоставите некоторый код/​​данные о том, что вы делаете в цикле, возможно, кто-то может предложить способы использовать меньшую (или постоянную) память. – Matthew

ответ

1

В PHP 5.3: gc_collect_cycles().

+0

Спасибо, попробую после обновления моего сервера. Я вернусь, если это сработает или нет. – benjick

+0

Ну, честно говоря, я сомневаюсь, что эта функция поможет. (Кроме того, вам может понадобиться сначала 'gc_enable()'). Однако PHP 5.3 имеет улучшенный сборщик мусора, который может обнаруживать циклические ссылки. Это может быть то, что вам нужно; Я знаю, что это помогло некоторым моим старым сценариям CLI. Итак, в основном: обновить PHP. Если проблема по-прежнему возникает, попробуйте эту функцию. Если он все еще сохраняется, то отправляйте больше кода ... что-то еще не так. – Matthew

0

Вот article по управлению памятью в PHP.

Вы также можете указать increase available memory in PHP, если вы еще не превышены.

Имейте в виду:

Иногда вы не можете просто «дамп памяти». В зависимости от вашего алгоритма вам могут понадобиться результаты предыдущих вычислений для будущих вычислений.

Ключевым моментом может быть разбиение вашей проблемы на более мелкие проблемы и решение их по отдельности.

Отметьте эту статью на Dynamic Programming.

0

Если это не серверное приложение, я бы рекомендовал разбить скрипт на задания cron.

В любом случае проблема более чем вероятна в том, что вы не будете осторожны с вашими переменными. Если у вас закончилась нехватка памяти, тогда вам нужно помнить, что нужно отключить() ваши переменные. Также обратите внимание на свою переменную область действия. Если переменная никогда не выходит за рамки, PHP GC не может ее очистить, пока вы не удалите все ссылки на нее.

+0

Я переписываю одну переменную снова и снова. Проверьте переменную, если она не соответствует переменной перезаписи и снова проверьте. – benjick

+0

Вы случайно связываете эту переменную? PHP должен освобождать память, если вы этого не делаете. В качестве теста попробуйте сделать unset() для этой переменной, прежде чем переустанавливать ее значение. Я понятия не имею, действительно ли это поможет или нет, но это стоит того. – Craige