我在这里几乎找不到关于幕后情况的信息。我正在使用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()
当我运行此命令以插入一个大的200Mb文件时,出现内存耗尽错误。我以为与PDO::PARAM_LOB
绑定将把我的文件流式传输到数据库,而不是立即将整个内容加载到内存中。显然我错了:p
PDO::PARAM_LOB
如何在后台以及在内存管理方面工作?还是我只是做错了?我能从文档was this statement from php.net中收集到的最多信息:
此示例打开一个文件,并将文件句柄传递给PDO以将其作为LOB插入。 PDO将尽最大可能以最有效的方式将文件的内容上传到数据库。
嗯,看起来就是这样。
https://bugs.php.net/bug.php?id=40913
此错误已开放13年。由于mysql不支持本机流,因此它将流转换为字符串并提交给查询。
所以我想我会尝试使用fopen()
加载约5000字节并以大块形式更新记录。