Как пойти о фиксации утечки памяти в PHP

Как указал eulerfx,

структура таблицы указывает, что может быть несколько документов для задачи

, и Крис заявил:

Помещая Task_ID в документ, фактическая связь - это HasMany, но у вас есть какое-то неявное понимание того, что на одну задачу будет только один документ.

Это, конечно, правильно, поэтому я перевернул его, чтобы у Task был обнуляемый Document_Id.

Спасибо вам обоим за вашу помощь!

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

17
задан thomasrutter 18 June 2009 в 07:11
поделиться

7 ответов

Было бы полезно взглянуть на код, но если вы хотите отладить его самостоятельно, посмотрите Xdebug , он поможет профилировать ваше приложение.

Конечно, в зависимости от того, что вы делаете, возможно, он накапливает некоторую память, хотя 132 МБ кажется уже большим объемом для 2500 записей. Конечно, при необходимости вы можете изменить ограничение памяти в php.ini.

Насколько велик CSV-файл, который вы читаете? И какие объекты и какую обработку вы с ним делаете?

5
ответ дан 30 November 2019 в 14:06
поделиться

you could try a local installation of php5.3 and call http://www.php.net/manual/en/function.gc-collect-cycles.php.

gc_collect_cycles — Forces collection of any existing garbage cycles

if the situation improves, you at least verified (on of) the problem(s).

2
ответ дан 30 November 2019 в 14:06
поделиться

Это зависит от того, как вы очищаете переменные после того, как закончили с ними.

Похоже, вы закончили с записью, но вы все еще где-то храните информацию. Используйте unset () , чтобы очистить переменные, если есть сомнения.

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

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

2
ответ дан 30 November 2019 в 14:06
поделиться

Если вы действительно подозреваете, что в вашем скрипте есть только одна или две утечки памяти, которые вызывают его сбой, тогда вам следует выполните следующие шаги:

  • Измените memory_limit на что-то маленькое, например 500 КБ
  • Закомментируйте все, кроме одного из шагов обработки, которые применяются к каждой строке.
  • Запустите ограниченную обработку над весь CSV-файл и посмотрите, можно ли его завершить.
  • Постепенно добавляйте больше шагов и наблюдайте, не увеличится ли использование памяти.

Пример:

ini_set('memory_limit', 1024 * 500);
$fp = fopen("test.csv", 'r');
while($row = fgetcsv($fp)) {
    validate_row($row);         // step 1: validate
    // add these back in one by one and keep an eye on memory usage
    //calculate_fizz($row);     // step 2: fizz
    //calculate_buzz($row);     // step 3: buzz
    //triangulate($row);        // step 4: triangulate
}
echo "Memory used: ", memory_get_peak_usage(), "\n";

В худшем случае все из ваши этапы обработки умеренно неэффективны, и вам нужно будет их все оптимизировать.

7
ответ дан 30 November 2019 в 14:06
поделиться

Можете ли вы изменить свой memory_limit в своем php.ini?

Кроме того, может ли команда unset ($ var) для переменных освободить некоторую память? Может ли $ var = null помочь?

См. Также этот вопрос: Что лучше для освобождения памяти с помощью PHP: unset () или $ var = null

0
ответ дан 30 November 2019 в 14:06
поделиться

Как вы читаете файл? Если вы используете fread / filegetcontents или другие подобные функции, тогда вы собираетесь использовать весь размер файла (или то, сколько вы загружаете с помощью fread) в памяти, поскольку весь файл загружается во время вызова. Однако, если вы используете fgetcsv if, вы будете читать только одну строку за раз, в зависимости от длины строки, это может значительно упростить вашу память.

Также убедитесь, что вы повторно используете столько переменных, сколько возможно на каждой петле. Убедитесь, что в них нет массивов с большими объемами данных.

1
ответ дан 30 November 2019 в 14:06
поделиться

Трудно сказать причину, не увидев кода. Однако типичной проблемой являются рекурсивные ссылки, т.е. объект A указывает на объект B и наоборот, что может привести к ошибкам GC.

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

На самом деле это одна из причин, по которой я часто предпочитаю Python для задач пакетной обработки.

0
ответ дан 30 November 2019 в 14:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: