我需要生成并存储大量小(1-10KB)PNG图像(> 10百万)到数据库。 我唯一关心的是图像/吞吐量。现在我知道将GD图像对象存储到数据库的两种方法:
ob_start();
imagepng($image);
$imageData = ob_get_contents();
ob_end_clean();
$tmpFilePath = '/dev/shm/file_000.png';
imagepng($image, $tmpFilePath);
$imageData = file_get_contents($thumbnail);
// PHP streams are NOT supported
$tmpFilePath = 'php://memory';
imagepng($image, $tmpFilePath);
$imageData = file_get_contents($tmpFilePath);
我的问题是有没有其他方法将图像写入数据库?每种方法的优点/缺点。 也许值得编写一个自定义流,直接将数据写入DB?
注意:将图像存储到文件系统不是一种选择。
答案 0 :(得分:1)
您可以尝试imagepng()
写一个memory stream而不是文件。
$tmpFilePath = 'php://memory/file_000.png';
imagepng($image, $tmpFilePath);
$imageData = file_get_contents($tmpFilePath);
虽然我不确定imagepng()
函数是否可以处理I / O流,但如果确实如此,它可能是一个不错的选择。
答案 1 :(得分:0)
我认为还有其他任何方式:imagepng()
没有选择返回数据流(我眼中的设计错误,但你打算做什么)。
上述哪种方式对您更好,您应该以此为基准;编写流包装器可能是值得的,因为它节省了写文件的步骤。
答案 2 :(得分:0)
将映像写入临时文件只会增加磁盘I / O,因此使用内存缓冲区是一个不错的选择。然后,您可以使用预准备语句的send_long_data函数将它们上载到DB中。 (但你可能已经知道了。)
答案 3 :(得分:0)
这两天不太可能影响你的总运行时间,因为这几天openreadclose在linux上的缓存文件需要大约20微秒。生成和压缩图像将成为时间消耗者(您应该首先优化占用时间最多的部分)。如果您真的想节省1%的总时间,请使用ob_()函数。
无论如何,如果你想将它们存储在数据库中,用BLOB检查数据库连接库的性能,有些非常糟糕,有些则很快。