我在服务器上存储了一些高分辨率文件(如果需要的话,可以存储10万以上),并将它们组织在不同的画廊中。当有人访问画廊时,我只显示缩略图和图像的低分辨率版本,在某些情况下带有水印,在其他情况下则不带水印。现在,由于我要说的是大量图片,因此X天后会从服务器上清除图库页面上显示的低分辨率版本。如果有人确实访问了图库并且服务器上不存在该文件的lowres版本,则该文件会即时生成,但是当我生成lowres时,可能需要给它加水印。
当前,显示图像的脚本不执行任何SQL调用,而是全部基于文件系统(如果文件存在等),并且是否对图像加水印的决定基于:
if (strpos($file_name,"FREE")===false){ //add watermark }else{ //just resize}
我的逻辑说,这比对文件名或文件ID进行SQL查询并检查它是否应为非水印图像更有效。但是,让文件名包含单词FREE有点不便。
如果我使用SQL查询而不是strpos,可以期待多少性能差异?
编辑/更新
总结答案和评论:
该系统被设计为可以工作几年,随着时间的推移,所有画廊的添加仍可访问。这意味着存储需求仅是巨大的,而较早的专辑高分辨率图像将在慢速且廉价的专用存储设备上移出现场,因此建议保留所有缩略图的额外开销是一个严峻的选择。去年,我需要存储超过3TB的图像(这只是高分辨率)。
我正在使用Lighttpd,并且打算使用
rewrite-if-not-file
以获得现有缩略图的最佳性能。我知道I / O的写入代价,我打算将其降至最低,仅在必要时写入,最好是读取。但是@ N.B。的评论的确使我想到了将低分辨率图像存储在SSD上,因此,即使我需要创建它们并将其写入磁盘,其I / O性能也比普通HDD好得多。
实际上,进行一些测试(@Steve E.)实际上是困难的。我的进度落后于计划,并且系统必须在本月底投入使用。 (今天我刚收到炸弹,他们正在拔掉旧系统上的插头)。是的,灵活性是我倾向于使用SQL的主要原因,但是我希望SQL数据库显着增长,除了文件信息之外,还有很多其他信息需要存储,标记,购买,下载等内容,因此,当我实际上可以通过良好的结构和对文件系统的访问来利用其中的某些内容时,我还尝试确保不会对SQL施加太大的压力。
最佳答案
如果不进行测试,很难确定哪种方法会更快。简单的逻辑可能表明PHP访问磁盘的速度更快,但这是基于许多假设的。
在配置良好的系统中,经常需要的变量将在RAM缓存中而不是磁盘中。这适用于文件系统的缓存以及MySQL缓存索引。缓存和其他机制的影响可能导致结果与预期不同。
在许多情况下,任何一种解决方案都将有效并且足够,因为在一个设计良好的系统中,对任何一个请求所花费的时间都应该最少,并且一种方法的额外性能可能不值得您在文件名中使用“ FREE”带来的不便。尝试两种方法并评估性能并不难。
从长远来看,还应考虑到MySQL提供了更大的灵活性来添加其他功能,如果所有状态都存储在文件名中,这些功能将变得很复杂。
如果性能确实是一个重要问题,那么可以考虑使用Web服务器在磁盘上(或在诸如memcache之类的缓存中)检查文件,并在将请求完全传递给PHP之前返回该文件是否存在。 Nginx和Apache都可以做到这一点,这是高流量网站的常见加速方法。