【发布时间】:2015-01-19 10:50:08
【问题描述】:
我正在构建一个基于 Web 的系统,该系统将托管大量的高分辨率图像,并且它们将可供出售。当然,我永远不会显示高分辨率图像,而是在浏览时人们只会看到低分辨率、带水印的图像。目前工作流程如下:
PHP脚本处理高分辨率图片上传,当图片上传时,它会自动调整为低分辨率图片和缩略图,并且两个文件都保存在服务器上,(不添加水印) .
当人们浏览时,页面会显示图像的缩略图,点击后,它会放大并显示带有水印的低分辨率图像。目前,每当打开低分辨率图像时,我都会即时应用水印。
我的问题是,正确的方法是什么:
1) 我应该只在第一次访问时保存带有缩略图的低分辨率图像的第二个副本吗?我的意思是,如果有人访问图像,我会即时添加水印,然后显示图像并将其存储在服务器上。如果存在水印副本,则下次访问相同的图像时,只需显示 wm 副本,否则即时应用水印。 (如果 watermark.png 被更改,只需删除带水印的图像,它们将在访问时重新创建。
2) 我是否应该像现在一样继续应用水印。
我最大的问题是 PHP file_exists() 和向图像添加水印之间的区别有多大,例如:
$image = new Imagick();
$image->readImage($workfolder.$event . DIRECTORY_SEPARATOR . $cat . DIRECTORY_SEPARATOR .$mit);
$watermark = new Imagick();
$watermark->readImage($workfolder.$event . DIRECTORY_SEPARATOR . "hires" . DIRECTORY_SEPARATOR ."WATERMARK.PNG");
$image->compositeImage($watermark, imagick::COMPOSITE_OVER, 0, 0);
所有低分辨率图片均为 1024x1024,JPG 质量设置为 45%,并移除了所有不必要的滤镜,因此低分辨率图片的文件大小约为 40Kb-80Kb。
和this question有点关系,只是规模和场景有点不同。
我在一个专用服务器(至强 E3-1245v2)cpu、32 GB 内存、2 TB 存储)上,该站点总体上的流量并不大,但不时会出现巨大的峰值。当图像发布时,我们每小时会获得几千次点击,人们通过图像浏览、下载、购买等。所以在正常使用时,我确信动态生成是正确的方法,我有点担心关于高峰期。
需要说明的是,我使用 ImageMagick 库进行图像处理,而不是 GD。
感谢您的意见。
更新
没有一个完整的解决方案的答案,但这很好,因为我从未寻找过。接受哪一个以及给予谁赏金是一个艰难的决定。
@Ambroise-Maupate 解决方案很好,但它依赖 PHP 来完成这项工作。
@Hugo Delsing 建议使用 web 服务器来提供缓存文件,减少对 PHP 脚本的调用,这意味着使用的资源更少,另一方面它对存储并不友好。
我将使用 2 个答案的混合合并解决方案,通过 CRON 作业来清除垃圾。
感谢您的指导。
【问题讨论】:
-
我认为在“高峰期”的情况下,保存带水印的图像可能是个好主意。另一方面,这将大大增加您在硬盘上使用的空间(在这种情况下,2TB 可以变得“小”)。我建议使用基于“查看次数”的方法:在您的数据库中,存储查看每个 img 的次数,然后仅保存最“流行”的水印版本。根据您网站的发展,您将能够增加或减少“已保存的带水印的 img”的数量。
-
问题在于,我们存储了事件的照片(泥泞、运动等)。当一个事件结束时,人们会开始看起来像任何创造“尖峰”的图像,然后它就会冷却下来。下一波“尖峰”将是一个不同的事件,因此它与之前的图像没有关系,所以在我的计数器击中目标并开始保存图像之前,尖峰已经很酷了......如果这使得感觉...
-
您绝对应该缓存它们而不是每次都生成它们。如果本地没有足够的存储空间,可以将它们缓存在 CDN 层中。
-
好的,埃米尔,我明白了。所以在这种情况下,只保存最后一个事件的水印版本。此外,您可以“准备”以节省时间:当您放置新事件的图像时,删除先前事件的水印,创建新 img 的所有预标记版本,然后使用新事件打开商店。跨度>
标签: php image server-load