Я написал инструмент для репликации базы данных на PHP. Работает нормально, но есть одна проблема:
Я использую PDO для подключения к различным базам данных, чтобы он не зависел от какой-либо конкретной СУБД, что крайне важно для этого приложения.
Инструмент выполняет некоторый анализ таблиц, чтобы решить, как преобразовать определенные типы и некоторые другие вещи. Затем он в значительной степени выполняет «SELECT * FROM <tablename>», чтобы получить строки, которые необходимо скопировать. Наборы результатов довольно велики (около 50 тыс. строк в некоторых таблицах).
После этого он перебирает набор результатов в цикле while с PDOStatement::fetch();, выполняет некоторое преобразование типов и экранирование, создает оператор INSERT и передает его в целевую базу данных.
Все это прекрасно работает за одним исключением. Извлекая строки из результирующего набора по очереди, процесс PHP продолжает потреблять все больше и больше памяти. Я предполагаю, что PDO хранит уже обработанные строки в памяти до тех пор, пока не будет обработан весь набор результатов.
Я также заметил, что когда мой инструмент заканчивает работу с одной таблицей и переходит к следующей, потребление памяти мгновенно падает, что подтверждает мою теорию.
Я НЕ храню данные в переменных PHP! Я держу только одну строку в любой момент для обработки, так что это не проблема.
Теперь к вопросу: есть ли способ заставить PDO не хранить все данные в памяти? Я обрабатываю только одну строку за раз, поэтому нет необходимости хранить весь этот мусор. Я действительно хотел бы использовать меньше памяти на этой штуке.