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

问题描述 投票:1回答:1

我在这里几乎找不到关于幕后情况的信息。我正在使用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将尽最大可能以最有效的方式将文件的内容上传到数据库。

php mysql pdo yii large-data
1个回答
1
投票

嗯,看起来就是这样。

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

此错误已开放13年。由于mysql不支持本机流,因此它将流转换为字符串并提交给查询。

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

© www.soinside.com 2019 - 2024. All rights reserved.