Почему PDO :: PARAM_LOB вызывает ошибку «Разрешенный размер памяти»? - PullRequest
2 голосов
/ 28 февраля 2020

Мне удалось найти очень мало информации о том, что происходит под капотом здесь. Я использую фреймворк Yii 1.1, но не верю, что это связано с этой проблемой. По сути, я использую этот код для вставки больших файлов в свою базу данных (сотни мегабайт).

$sql = "
    UPDATE {$this->tableName()}
    SET `$column` = :value
    WHERE `$pkField` = :index
";

// $stream is a resource from fopen()
$command = Yii::app()->getDb()->createCommand($sql);
$command->bindValue(':index', $id);
$command->bindValue(':value', $stream, PDO::PARAM_LOB);

$command->execute()

При запуске этого файла для вставки большого файла размером 200 МБ появляется ошибка исчерпания памяти. Я думал, что связывание с PDO::PARAM_LOB передаст мой файл в базу данных вместо того, чтобы загружать все это в память сразу. Очевидно, я не прав: p

Как PDO::PARAM_LOB работает под капотом и с точки зрения управления памятью? Или я просто делаю это неправильно? Максимум, что я мог почерпнуть из документов , было это утверждение от php. net:

Этот пример открывает файл и передает дескриптор файла в PDO для вставки это как LOB. PDO сделает все возможное, чтобы содержимое файла было передано в базу данных наиболее эффективным способом.

1 Ответ

3 голосов
/ 03 марта 2020

Ну, похоже, именно так все и работает.

https://bugs.php.net/bug.php?id=40913

Эта ошибка была открыта в течение 13 лет. Он преобразует поток в строку и отправляет это в запросе, поскольку mysql не имеет встроенной поддержки потоковой передачи.

Так что, я думаю, я попытаюсь использовать fopen() для загрузки в 5000 байтов или около того и обновления запись кусками.

...