在过去的几天里,我一直在从事一个项目,并在网站的一个区域的画廊中显示大量图像(总共 +20gb ~1-2gb/目录)时遇到了问题。该站点建立在引导框架之上。我一直在尝试制作大型轮播,但由于 /images 的大小组合,最终无法流畅运行。
2 回答
A)将这么多二进制数据存储到数据库中是个坏主意,即使数据库允许,你也不应该使用它,它也会给你更多的内存消耗,你所有的数据都将存储在数据库的内存空间,然后复制到PHP的内存空间给你处理,吃掉两倍内存,加上运行数据库服务器,查询等开销。所以不,用数据库比较慢,直接访问文件系统更快,如果您还使用清漆或其他前端缓存系统,您甚至可以更快地提供内容。
我要做的是将文件存储在文件系统上,处理静态服务的最佳服务器是 G-WAN 或 NGINX Source,但请仔细阅读并自行决定最适合您的服务器。关键是,远离 apache,并且可能将所有这些静态文件托管到运行轻量级 http 服务器的单独服务器上
专业提示:保存同一图像的多个副本,按比例缩小尺寸,例如 50%,另一个版本使用原始图像尺寸的 25%,这样您就可以先发送缩略图以便快速浏览,然后当用户决定要查看您提供的 50% 或 100% 大小的图像,具体取决于它们的屏幕大小,这样您就可以节省带宽和内存。您还可以为移动用户节省一大笔 3G 费用。
B)这是使用数据库有意义的地方,您可以将所有目录索引到数据库中,并使用它来存储图像在 FS 中的位置,也许还有一些标签,甚至可能是视图数量, ETC...
并且在前端,您将实现一个 scipt,例如每页获取 50 个缩略图,然后用户可以使用一些花哨的 JQuery 滚动,当您需要获取更多内容时,只需获取一个包含 50 个以上拇指的新结果集, ETC..
这样您就可以节省内存、带宽,甚至用户也会感谢您提供如此轻量级的浏览体验!
另一个提示: 如果您希望能够处理更大的流量,您可能需要考虑使用 CDN,有许多 CDN 服务不像 Amazon S3 那样昂贵,简单的搜索将为您提供大量资源!
快乐黑客!
虽然这个问题有点笼统,但对于您的两个问题,这里有一些想法:
A)不,从数据库中提取图像的性能很可能比直接从文件系统中提取图像更差。一般来说,除非绝对必要,否则将图像或其他二进制数据存储在数据库中并不是一个好主意,因为数据库无法处理这些信息,而您只是在文件系统之上添加了一个额外的层,它不会不需要在那里。但是,您可能希望在数据库中存储图像的路径,并可能与其他特征(例如图像尺寸、缩略图路径、关键字等)一起存储。然后您的应用程序将读取图像的条目以返回图像的正确路径.
B)如果您要显示数百或数千张照片,您几乎肯定会想要实现某种分页。如果最终显示必须是轮播,您将需要研究驱动它的 Javascript,以确定如何挂钩一个函数,该函数在到达结尾或接近结尾时通过 AJAX 调用从 PHP 应用程序检索更多结果当前的图像列表。如果由于图像过多而导致浏览器崩溃,您还需要在<li>
加载新图像时从 s 列表的第一部分中删除图像,以便控制 DOM。