从PHP GD图像对象将图像存储到DB的有效方法

时间:2011-05-14 21:27:15

标签: php gd

我需要生成并存储大量小(1-10KB)PNG图像(> 10百万)到数据库。 我唯一关心的是图像/吞吐量。现在我知道将GD图像对象存储到数据库的两种方法:

使用输出缓冲区:

ob_start();
imagepng($image);
$imageData = ob_get_contents();
ob_end_clean();

使用临时文件(tmpfs / ramfs):

$tmpFilePath = '/dev/shm/file_000.png';
imagepng($image, $tmpFilePath);
$imageData = file_get_contents($thumbnail);

<击>更新。有第三种方法:使用PHP内存流:

// PHP streams are NOT supported
$tmpFilePath = 'php://memory';
imagepng($image, $tmpFilePath);
$imageData = file_get_contents($tmpFilePath);

我的问题是有没有其他方法将图像写入数据库?每种方法的优点/缺点。 也许值得编写一个自定义流,直接将数据写入DB?

注意:将图像存储到文件系统不是一种选择。

基准测试结果:

Generating and saving 10k PNG images

4 个答案:

答案 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检查数据库连接库的性能,有些非常糟糕,有些则很快。