【发布时间】:2019-01-03 12:16:36
【问题描述】:
我正在尝试使用数据库缓存作为缓存非常大的对象的一种方式,然后我想将这些对象流式传输而不是加载到内存中并返回。
为此,我尝试了以下方法:
我使用以下迁移创建了我的数据库缓存:
public function up() {
Schema::create('cache', function (Blueprint $table) {
$table->string('key')->unique();
$table->longText('value');
$table->integer('expiration');
});
DB::statement("ALTER TABLE `cache` MODIFY `value` LONGBLOB");
}
更改的原因是因为longText 不适用于我需要存储的通用二进制对象。
然后我尝试了以下代码来测试 blob 字段的流式传输:
public function test(Request $request) {
cache()->store("database")
->put("randomStr", str_random(1024), 5); //Test string. Real cases are about 200 MB
return response()->stream(function () {
$fullKey = config("cache.prefix")."randomStr";
$pdo = \DB::getPdo();
$stmt = $pdo->prepare("select `value` from `cache` where `key`=:key");
$stmt->bindParam("key", $fullKey);
if ($stmt->execute()) {
$stmt->bindColumn(1, $lob, \PDO::PARAM_LOB);
$stmt->fetch(\PDO::FETCH_BOUND);
fpassthru($lob);
}
});
}
此代码基于PHP: Large Objects 手册页。
但是我收到以下错误:
fpassthru() 期望参数 1 是资源,给定字符串
我检查了 $lob 参数,发现它是实际的字符串,而不是我希望的 LARGEBLOB 字段的流。
有什么方法可以让 BLOB 流在 Laravel 中工作?
注意:显然自 2007 年以来有 bug #40913 开放来解决这个问题,现在我提出了问题:
有没有办法使用PDO 或mysqli 或PHP 中的任何其他解决方法将LARGEBLOB 流式传输到响应?
【问题讨论】:
-
愚蠢的问题....但这不是 Jeremy Cook's 在手册页上的评论吗?
-
@CD001 可能。看到手册说它应该如何工作并且评论有点旧,我有点自动解雇它。我现在用谷歌搜索,似乎这个错误在过去 11 年里都存在。
-
11 年 .... 我认为它是某种超级蟑螂而不是虫子!