Php 处理用户映像上载的推荐体系结构

Php 处理用户映像上载的推荐体系结构,php,web-applications,upload,photo,Php,Web Applications,Upload,Photo,过去,我以两种不同的方式处理用户图像上传: 将图像数据保存在数据库表中,并通过PHP脚本加载 上传图像,将其转换为jpeg格式,将其放入目录中,并通过HTML标记加载 第一个选项运行得相当好,但我必须对上传的图像保持相当严格的大小限制。第二个选项是可行的,除了PHP的图像库经常会破坏文件转换(不过,我认为这可以通过使用ImageMagick来解决) 我现在面临着第三次这样做,在一个潜在的更大规模的用户。我已经计划在上传后使用ImageMagick对图像进行一些后期处理。我希望上传图片的限制尽

过去,我以两种不同的方式处理用户图像上传:

  • 将图像数据保存在数据库表中,并通过PHP脚本加载
  • 上传图像,将其转换为jpeg格式,将其放入目录中,并通过HTML标记加载
第一个选项运行得相当好,但我必须对上传的图像保持相当严格的大小限制。第二个选项是可行的,除了PHP的图像库经常会破坏文件转换(不过,我认为这可以通过使用ImageMagick来解决)

我现在面临着第三次这样做,在一个潜在的更大规模的用户。我已经计划在上传后使用ImageMagick对图像进行一些后期处理。我希望上传图片的限制尽可能小,甚至可能保留别人上传的每一张照片

有时,数百张用户上传的照片会以缩略图的形式一次显示在屏幕上。将这些图像存储在数据库中,然后逐个提取并通过PHP显示,这似乎不是一个好方法,但将所有图像放入一个目录也不是

在这种情况下,你有什么建议?您是选择上述选项之一,还是有不同的解决方案

将这些图像存储在数据库中,然后逐个提取并通过PHP显示,这似乎不是一个好方法,但将所有图像放入一个目录也不是

你可以采取混合方法

将图像存储在文件夹的继承权中(根据您确定的适合您的应用程序的任何方案)。在数据库中存储每个图像的完整路径

在后台作业中,生成文件名与图像本身略有不同(例如:在前面添加“thumb-”),但与真实图像一起存储的图像的缩略图(例如使用ImageMagick)。您可以在数据库中为每个图像设置一个字段,这意味着“我的缩略图已准备就绪,请将我包括在图库中”

当您收到画廊请求时,使用数据库字段对图像组进行切片,然后生成一段HTML,该HTML引用适当的缩略图和图像路径


编辑:
当您需要处理大量请求时,Aaron F所说的话非常重要。对映像/sql数据进行分区是实现可伸缩性的好方法。您需要查看应用程序中的访问模式,以确定分区点的位置。为了减少SQL负载,您可以更快地为库缓存生成的HTML。

您引用的两个示例没有阐明最重要的部分:分区

e、 g.如果存储在数据库中,图像是否完全驻留在一个数据库服务器上的一个表中?或者该表是跨多个服务器/集群分区的

e、 g.如果存储在目录中,是否所有图像都驻留在一个硬盘上?或者图像是否根据用户登录名的第一个字母映射到单独的[RAID]驱动器

为了实现可伸缩性,需要一个好的分区方案


至于批量显示缩略图,您可能需要在此处进行一些预计算。i、 e.创建缩略图(可能通过ayschronous作业,在上传图像后立即启动),并将其放置在专用服务器上。Youtube就是这样对上传的视频进行图像快照的

Imho,David的解决方案在大多数情况下都是最好的,但我要修改两个细节:

在数据库中存储每个图像的完整路径

我认为您不需要存储完整路径,因为如果由于某种原因图像目录发生更改,这将使您的生活变得复杂一点。只存储文件名就足够了。您始终可以在html中直接包含完整路径

制作图像的缩略图(比如ImageMagick),其文件名与图像本身略有不同,但与真实图像一起存储

我更喜欢将缩略图放在不同的目录中,每个缩略图对应一个目录,并且具有完全相同的文件名。我曾经在一个有数千张用户图片的网站上工作,我犯了一个错误,把它们都放在同一个目录中。该目录增长如此之快,以至于几乎不可能在不等待几分钟的情况下打开该目录

PHP的图像库经常会破坏文件转换

我建议在创建thumb的脚本中增加内存限制,特别是在允许上传大(2mb+)文件的情况下


您可以使用
ini_set('memory_limit','30M')来实现这一点。当然,实际数字由你决定。30M曾为我在缩略图较多的网站上工作。

uhm要创建缩略图,请使用。。。这是绝对完美的事情。。。还有一些额外的,但你可能不需要这些。。。它会自动在文件系统上创建一个本地缓存,因此非常节省资源

我认为,混合方法可能是最具可扩展性的,即将文件存储在文件系统中,并将文件位置存储在数据库中。。。这样,您就可以在文件中存储一些元数据(如创建者、标题、标记等),并保持数据库的小型化。。。此外,您可以将图像存储在任意位置(甚至在其他机器上,等等),因此您可以轻松地分发所有有效负载

格里茨


back2dos几年前,我写了一个内部网图像存档,最终存储了大约34万次扫描和相关缩略图。通过谷歌搜索,我发现只要不要求底层操作系统列出文件夹列表,就没有理由不将它们全部转储到一个目录中。换句话说,调用ls/dir将挂起计算机,但仅通过文件名(从数据库)检索单个图像文件并不意味着性能损失