В моем приложении PHP есть импорт script, который может импортировать записи.
В настоящий момент он импортируется из файла CSV. Он считывает каждую строку файла CSV, по одной строке за раз, используя fgetcsv, и для каждой строки он много обрабатывает эту запись, включая запросы к базе данных, а затем переходит к следующей строке. Не нужно больше накапливать больше памяти.
После того, как импортировано около 2500 записей, PHP умирает, заявив, что он преодолел свой предел памяти (132 МБ или около того).
Файл CSV сам по себе является всего лишь несколькими мегабайтами - другая обработка, которая происходит, содержит множество сравнений строк, различий и т.д. У меня на нем огромное количество кода, и было бы сложно найти "самый маленький воспроизводящий образец".
Каким образом можно найти и устранить такую проблему?
Причина найденной проблемы
У меня есть класс отладки, который регистрирует все мои запросы к базе данных во время выполнения. Так что эти строки SQL, длиной около 30 КБ, остались в памяти. Я понимаю, что это не подходит для сценариев, предназначенных для работы в течение длительного времени.
Возможно, существуют другие источники утечек памяти, но я уверен, что это является причиной моей проблемы.