为什么 PDO::PARAM_LOB 导致允许的内存大小耗尽错误?

Why does PDO::PARAM_LOB cause an Allowed memory size exhausted error?

关于这里发生的事情,我只能找到很少的信息。我正在使用 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:

This example opens up a file and passes the file handle to PDO to insert it as a LOB. PDO will do its best to get the contents of the file up to the database in the most efficient manner possible.

好吧,这似乎就是它的工作原理。

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

这个bug已经开13年了。它将流转换为字符串并在查询中提交,因为 mysql 没有本地流支持。

所以我想我会尝试使用 fopen() 加载 5000 字节左右并更新记录块。

更新:Well spank my nekudotayim, the bug was fixed! 但仅适用于 SQLite :( 显然,为 MySQL 修复它需要对 PDO 进行一些修改。