成千上万用户的图片上传

时间:2011-12-20 09:37:50

标签: php codeigniter upload

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

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

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

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

1 个答案:

答案 0 :(得分:3)

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

我们有一个遗留的结构导致了问题,系统缓慢但肯定地陷入停顿,我们无法弄清楚原因。经过一番挖掘,我们发现问题在于我们在一个目录中的数字文件。我们已经意识到原始代码库将所有拇指钉和原始图像放在同一个文件夹中,我们已达到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 of time +一个随机种子来生成它。

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

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

            AllowOverride all         订单拒绝,允许         允许所有

        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]
    

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