【问题标题】:Image upload for thousands of users为成千上万的用户上传图片
【发布时间】:2011-12-20 09:37:50
【问题描述】:

我正在使用 Codeigniter 开发 API。在这个 API 中,我想允许人们将图像上传到他们的帐户。然后将这些图像制作成缩略图和原件。

我正在使用框架附带的内置上传和图像处理库。这一切都很好,但我有点担心如果每天有成千上万的人上传会出现问题。

那么我使用的原版库可以正常工作吗?假设我的代码很好,或者我需要使用其他方式来处理上传和图像处理。有什么建议吗?

这一切都可能取决于服务器设置吗?

【问题讨论】:

    标签: php codeigniter upload


    【解决方案1】:

    我们刚刚在我的工作地点解决了一个类似的问题。希望您能从我们的解决方案中获得一些见解:

    我们有一个导致问题的遗留结构,系统缓慢但肯定会停止,我们无法弄清楚原因。经过一番挖掘,我们发现问题在于我们在一个目录中拥有的数字文件。我们已经意识到原始代码库将所有缩略图和原始图像放在同一个文件夹中,我们已经达到了 68347 个文件!这是一个明确的问题。我们还意识到,如果多个用户上传图像,服务器可能会变慢,然后服务器会处理上传以及图像的缩放和裁剪。

    我们现在已经实施了一个新的解决方案,我们认为它足够强大,可以应对我们未来面临的任何挑战。归结为三点: - 一个带时间戳的图像文件夹结构(目录结构决策使用策略模式实现,因此如果遇到任何问题我们可以轻松创建新策略) - 仅在上传时处理上传 - 当请求该尺寸的图像时管理缩略图(这只发生一次,并且每当第一次查看图像时) - 我们转移到 Imagine 库来处理裁剪和缩放过程,因为我们发现它在图像质量方面比 ImageMagik 和 GD 产生了更好的结果。 Check it out on Git.

    以下是解决方案的详细信息: 1. 对于每种类型的上传(徽标、用户头像、文档等)我们将有一个基本目录,例如/.../uploads/logos/

    1. 我们会为上传文件的每一天创建一个新文件夹,例如/.../uploads/20122011/

    2. 在这些文件中,我们将有一个分桶文件夹结构,其中每个文件夹中的文件不超过 1000 个,例如/.../uploads/20122011/0//.../uploads/20122011/1000/

    3. 上传的每张图片我们都会生成一个伪唯一名称(32 个字符长),我们使用 md5 时间 + 一个随机种子来生成它。

      李>
    4. 在上传时,如果图像正在替换另一个图像,我们将更新数据库中的相关行,然后从数据库中删除孤立文件。

    5. 将在第一次请求时处理图像的缩略图。我们使用 http conf 文件中的以下规则实现了这一点:

      允许覆盖所有 订单拒绝,允许 全部允许

          RewriteEngine On
          RewriteCond %{HTTP_HOST} ^static\.(.*)$
          RewriteCond %{REQUEST_FILENAME} !-f
          RewriteCond %{REQUEST_FILENAME} ^(.+)\.(jpg|jpeg|png|gif)$
          RewriteRule ^.*$ /path/to/public/thumbnailer.php [NC,L]
      

      这会将任何对不存在的图像文件的请求重定向到我们的缩略图。是否会处理任何可接受的请求并生成新的缩略图。

    【讨论】:

    • 非常感谢您的回答!几个问题。 1. 为什么上传的时候不缩放图片(我用的是5个尺寸)?我使用的是 Amazon S3,这会改变文件夹结构吗?
    • @Jonathan - 您将为每个上传的图像依次执行 5 次操作。这可能是必要的开销,但是我们推测并非所有图像都以所有格式查看,并且绝对不能立即证明所有这些前期处理的合理性。因此,我们决定尽量减少上传期间的开销,并将此操作的处理移至第一个请求。当您开始考虑可能永远不会请求的数十万张图像时,它还可以节省服务器空间。对于 S3 ,我认为不会。永远不要引用我的话!
    • 好的,我明白你的意思了。我正在开发的 API 可能会为 iOS 应用程序(例如 Instagram)提供服务,然后在上传完成后直接“看到”图像。有没有办法让图像在单独的“线程”上调整大小?
    猜你喜欢
    • 2014-12-29
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 2018-10-12
    • 1970-01-01
    • 2011-01-05
    相关资源
    最近更新 更多