图片上传成千上万的用户


Image upload for thousands of users

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

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

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

是否都取决于服务器设置?

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

我们有一个遗留的结构导致了问题,系统缓慢但肯定地慢慢停止,我们不知道为什么。经过一番调查,我们发现问题出在一个目录下的文件数量太多。我们已经意识到原始代码库将所有缩略图和原始图像放在同一个文件夹中,我们已经达到了68347个文件!这是一个明确的问题。我们还意识到,如果多个用户同时上传图像,服务器可能会变慢,然后服务器处理上传以及图像的缩放和裁剪。

我们现在已经实现了一个新的解决方案,我们认为它足够强大,可以应对我们未来面临的任何挑战。这可以归结为三点:-图像的桶状时间戳文件夹结构(目录结构决定是使用策略模式实现的,所以如果遇到任何问题,我们可以很容易地创建一个新的策略)-只在上传时处理上传-当图像被请求时,拇指钉是管理的(这种情况只发生一次,每当图像第一次被查看)-我们转向Imagine库来处理裁剪和缩放过程,因为我们发现它在图像质量方面比ImageMagik和GD产生更好的结果。在Git上查看。

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

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

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

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

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

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

    AllowOverride所有否认,允许允许从所有

        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]
    

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