yii 为什么PDO::PARAM_LOB会导致“Allowed memory size exhausted”(已耗尽允许的内存大小)错误?

pes8fvy9  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(133)

我能找到的信息非常少,我使用的是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将尽可能以最有效的方式将文件的内容上传到数据库。

irlmq6kh

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进行一些修改。

相关问题