我能找到的信息非常少,我使用的是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
绑定会将我的文件流到数据库中,而不是一次将整个文件加载到内存中。显然我错了:pPDO::PARAM_LOB
在内存管理方面是如何工作的?或者我只是做错了?我从was this statement from php.net文档中收集到的最多的信息是:
这个例子打开一个文件,并将文件句柄传递给PDO,以将其作为LOB插入。PDO将尽可能以最有效的方式将文件的内容上传到数据库。
1条答案
按热度按时间irlmq6kh1#
看起来就是这样。
https://bugs.php.net/bug.php?id=40913
这个bug已经存在了13年了,它将流转换成字符串,然后在查询中提交,因为mysql没有原生的流支持。
因此,我想我将尝试使用
fopen()
加载大约5000个字节,并以块为单位更新记录。更新:Well spank my nekudotayim, the bug was fixed!,但仅适用于SQLite:(显然,为MySQL修复它需要对PDO进行一些修改。