Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用于存储数百万图像的文件夹结构?_Php_Mysql_Photo_Storage - Fatal编程技术网

Php 用于存储数百万图像的文件夹结构?

Php 用于存储数百万图像的文件夹结构?,php,mysql,photo,storage,Php,Mysql,Photo,Storage,我正在建立一个网站,可以轻松上传数百万张照片(每上传一张图片都有3个缩略图),我需要找到存储所有这些图片的最佳方法 我已经搜索并找到了以散列形式存储的图像示例。。。。例如 如果我上传coolparty.jpg,我的脚本会将其转换为Md5哈希,结果是 dcehwd8y4fcf42wduasdha.jpg 它存储在/dc/eh/wd/dcehwd8y4fcf42wduasdha.jpg 但是对于3个缩略图,我不知道如何保存它们 问题.. 这是存储这些图像的正确方法吗 我如何储存缩略图 在PHP中,

我正在建立一个网站,可以轻松上传数百万张照片(每上传一张图片都有3个缩略图),我需要找到存储所有这些图片的最佳方法

我已经搜索并找到了以散列形式存储的图像示例。。。。例如

如果我上传coolparty.jpg,我的脚本会将其转换为Md5哈希,结果是

dcehwd8y4fcf42wduasdha.jpg
它存储在
/dc/eh/wd/dcehwd8y4fcf42wduasdha.jpg
但是对于3个缩略图,我不知道如何保存它们

问题..

  • 这是存储这些图像的正确方法吗

  • 我如何储存缩略图

  • 在PHP中,使用上述方法存储这些图像的示例代码是什么

  • 1) 这是只有你才能回答的问题。一般来说,我更喜欢将图像存储在数据库中,这样您就可以有一个一致的备份,但不需要备份

    2) 怎么做?那么/dc/eh/wd/dcehwd8y4fcf42wduasdha_thumb1.jpg、/dc/eh/wd/dcehwd8y4fcf42wduasdha_thumb2.jpg和/dc/eh/wd/dcehwd8y4fcf42wduasdha_thumb3.jpg呢


    3) ???您是在询问如何将文件写入文件系统还是…?

    如何使用文件夹结构:

    • 我正在上传照片,并按你说的那样移动它:

      $image = md5_file($_FILES['image']['tmp_name']);
      // you can add a random number to the file name just to make sure your images will be "unique"
      $image = md5(mt_rand().$image);
      $folder = $image[0]."/".$image[1]."/".$image[2]."/";
      
      // IMAGES_PATH is a constant stored in my global config
      define('IMAGES_PATH', '/path/to/my/images/');
      // coolparty = f3d40fc20a86e4bf8ab717a6166a02d4
      $folder = IMAGES_PATH.$folder.'f3d40fc20a86e4bf8ab717a6166a02d4.jpg';
      // thumbnail, I just append the t_ before image name
      $folder = IMAGES_PATH.$folder.'t_f3d40fc20a86e4bf8ab717a6166a02d4.jpg';
      // move_uploaded_file(), with thumbnail after process
      // also make sure you create the folders in mkdir() before you move them
      
    • 我相信这是最基本的方法,当然,你可以改变文件夹结构到一个更深层的,就像你说的,如果你有数百万张图片,有2个字符


    使用这种方法的原因只是为了减少每个目录(inode)的文件总数

    使用您描述的方法(3级深度),您不太可能在每个目录中获得数百个图像,因为您的目录最大数量几乎为17MM。16**6

    至于你的问题

  • 是的,这是储存它们的好方法
  • 我会这样做的

    /aa/bb/cc/aabbccdddddddddddd_thumb.jpg
    /aa/bb/cc/aabbccdddddddddddddd_large.jpg
    /aa/bb/cc/aabbccdddddddd_full.jpg

    或类似

  • 关于如何实际存储图像,网上有很多例子。你有更具体的问题吗

  • 如果你说的是数百万张照片,我建议你将这些照片转包给第三方,比如AmazonWeb服务,更具体地说,就是这个AmazonS3。文件的数量没有限制,并且假设您不需要实际列出文件,则根本不需要将它们分隔到目录中(如果确实需要列出,则可以使用不同的delimeter和前缀-)。而且,您的托管/重新访问成本可能会比您自己的成本更低,而且它们会得到备份

    更具体地说,是的,按子目录拆分;使用您的结构,您可以删除文件名的前5个字符,因为您已经准备好将其放在目录名中

    正如阿奎那所建议的那样,拇指只是出现在文件名上。或者将它们存储在单独的文件夹中。

    改进答案

    对于数以百万计的图像,使用数据库会减慢处理速度是正确的

    最好的选择是使用“服务器文件系统”存储图像,并使用.htaccess添加安全性

    或者您可以使用web服务。许多服务器都提供了用于上传、显示图像的Api。

    你也可以选择这个选项。例如,Amazon

    在数据库中存储数以百万计的图像不是正确的方法。从数据库中提取图像并显示它们比使用文件访问要慢。当然也比文件访问要慢system@Hameed-你有证据支持这个说法吗?我正在失去找到这个的裁判。。但在搜索之后,我发现了另一种方法,因为从数据库中提取图像并显示它们比使用文件访问要慢。考虑到有多少图像,将这些图像存储在传统的sql数据库中不是一种好方法。像Cassandra、Redis、Riak等这样的无sql数据库更容易接受,但文件系统应该是第一考虑因素。@Hameed-我认为这样的笼统陈述是不合理的。涉及的变量太多。(数据库缓存;文件系统争用;分布式文件系统等)如果需要任何类型的锁定,数据库可能比自制的基于文件的锁定系统更加健壮和灵活。@Hameed,正如我所说,您的里程可能会有所不同。我没有注意到问题被标记为MySQL。在SQL Server中,有一个FileStream数据类型:正是出于此目的。此外,在MySQL中,您能否创建一个触发器,允许您从文件系统中删除文件(以模拟级联删除)?这可能是可能的,我只是不知道该怎么办。希望你有一个拥有大量带宽的descent spec服务器。如果你有两个用户上传一个名为
    coolparty.jpg
    的文件,会发生什么?你需要将用户名作为文件名的一部分存储在某个地方吗?对于那些因为“速度慢”而口碑不好的数据库来说——没有数字支持,这只是空话。是的,数据库可能很慢。文件系统也可能很慢。(试着把一百万甚至50000张图片放在一个目录中,看着你的文件访问时间飞涨。)至于数据库,这就是使用数据库的理由。另外,请参见网站管理员。这个实现可能很有用:github.com/acrobit/AcroFSok,关于S3服务,目前我不打算这么做,但如果我坚持目前的方法,我会考虑,如果我决定将所有文件都移动到S3,那么将所有文件都转移到那里会很容易吗?编写一个脚本将所有文件从文件系统移动到S3会很容易。您甚至可以维护您的目录结构。+1表示感谢。s3是一个非常好的服务。是的-一旦项目启动并运行,你可以将它们全部移动。但是设置AmazonS3最复杂(也是最烦人)的事情是注册一个