如何在ZF中为媒体资产实施云存储?

时间:2011-08-04 14:19:10

标签: php zend-framework amazon-s3 cloud storage

我从未编写任何云应用程序,所以我基本上都在研究开始使用它。我正在开发Zend Framework,并希望使用云来存储媒体资产。整个项目应该可以扩展到云。考虑到这一点,我脑海里浮现出越来越多的问题:

  • 您会推荐哪个存储提供商?
  • 如何处理资产的访问权限? (如果相关文章被发布,公众应该只能访问它们。)
  • 如何跟踪所有资产? (命名约定?创建数据库以将它们分配给文章?)
  • 我如何在zend框架中引用它们? (使用类似cloudfront的cdn是否有意义?如何创建网址?)
  • 我可以保持我的代码通用,以便能够随着项目的增长从本地存储(最初)切换到云存储吗?
  • 如何针对不同设备/屏幕尺寸优化资源?我还可以只有一个来源吗?

我想做什么:

  1. 媒体资产由记者上传
  2. 服务器将原始文件保存到云端(仅限制资产)
  3. 服务器为web准备图像(缩放,质量)并将其保存到云端
  4. 媒体与新闻文章相关联
  5. 管理员
  6. 发布或删除(不发布)新闻和相关媒体资产
  7. 如果资产被释放,我想通过CDN分发资产。
  8. 我非常感谢有关如何解决这个项目的提示; - ]

1 个答案:

答案 0 :(得分:7)

我会推荐亚马逊S3,它也是我一直在开发的东西。我还将从AWS S3的角度回答您的问题。

  

如何处理资产的访问权限? (公众应该只是   能够在相关文章发布时访问它们。 )

将文件上载到Amazon S3时,您可以选择访问策略。您还可以为整个“存储桶”中的每个文件设置访问策略。存储桶是用于指代基于“云”的存储库的唯一名称。存储桶中的每个文件都由一个密钥访问。

例如,您上传名为myAwesomeImage.jpg的文件。现在,当您将该文件传输到S3时,您可以为该文件选择多个选项。

  • 内容类型
  • 存储选项
  • ACL规则
  • 键/名称

因此,您可以选择将您的精彩图像放在名为some/path/to/file的“假目录”中。因此,您需要为此对象创建一个“键”,以存储在“键”"some/path/to/file/myAwesomeImage.jpg".

您的存储桶可以存储数十亿个对象,您可以选择存储它们的方式,您可以选择使用正斜杠来创建文件夹,但它实际上并不创建文件夹,它只是一个有用的您可以在应用程序中使用的机制来表示文件中的深度和组织。

现在, ACL

因此,当您上传对象时,您可以选择多个默认访问策略,也可以创建自己的。例如,如果您将对象上传为ACL_PUBLIC,则表示任何人都可以访问它。

但是,如果您将其上传为ACL_PRIVATE,则表示它是私有的,只有该文件的所有者才能访问它。

实施例

How do I keep track of all the assets? (Naming conventions? Create
     

将数据库分配给文章的数据库?)

所以你有几个选择。 您可以缓存所有内容以存储Bucket的本地状态,也可以不断检查Amazon S3 API以找出您拥有的文件。 您将根据您的应用知道您需要哪些。

采取我的情况...... 将图像上传到我们公司的文件管理器,然后自动生成三个缩略图,然后也应用水印。这意味着每个图像可以生成至少3个图像,最多可生成数百个(取决于我们需要应用多少个不同的水印)。

在我们的情况下,我上周将2k图像上传到S3,然后将其导入我们的文件管理器。我拥有来存储我们在S3中拥有的本地表示,因为否则搜索和查询存储库需要很长时间。我也对我们拥有的水印文件和缩略图不感兴趣,但我确实需要确保它们是生成的。在本地存储意味着您可以完成所有这些操作。

这是我files表的架构。 (但我还有另一个files_dimensions)表,它也存储了我的所有维度。

CREATE TABLE `files` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `lft` int(11) NOT NULL,
  `rgt` int(11) NOT NULL,
  `name` varchar(64) NOT NULL,
  `lastModified` date DEFAULT NULL,
  `size` int(11) DEFAULT NULL,
  `keyPath` varchar(255) DEFAULT NULL,
  `root` int(11) DEFAULT NULL,
  `type` varchar(11) DEFAULT NULL,
  `mime` varchar(64) DEFAULT NULL,
  `extension` varchar(11) DEFAULT NULL,
  `s3Synced` tinyint(1) DEFAULT NULL,
  `transferInProgress` tinyint(1) DEFAULT NULL,
  `bytesTransfered` bigint(20) DEFAULT NULL,
  `transferTotalTime` double DEFAULT NULL,
  `transferAverageSpeed` bigint(20) DEFAULT NULL,
  `amazonAcl` varchar(255) DEFAULT NULL,
  `transferFailCount` smallint(6) DEFAULT NULL,
  `transferFailMessage` varchar(255) DEFAULT NULL,
  `owningProperty` bigint(20) DEFAULT NULL,
  `bucketId` bigint(20) DEFAULT NULL,
  `ownerId` bigint(20) DEFAULT NULL,
  `md5Name` varchar(32) DEFAULT NULL,
  `transferInitiated` date DEFAULT NULL,
  `rrs` tinyint(1) DEFAULT NULL,
  `etag` varchar(66) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `files_owningProperty_idx` (`owningProperty`),
  KEY `files_bucketId_idx` (`bucketId`),
  KEY `files_ownerId_idx` (`ownerId`),
  CONSTRAINT `files_ibfk_1` FOREIGN KEY (`owningProperty`) REFERENCES `entities` (`id`) ON DELETE CASCADE,
  CONSTRAINT `files_ibfk_3` FOREIGN KEY (`ownerId`) REFERENCES `acl_users` (`id`),
  CONSTRAINT `files_ibfk_4` FOREIGN KEY (`bucketId`) REFERENCES `aws_buckets` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
  

我如何在zend框架中引用它们? (使用a是否有意义   像云端一样吗?如何创建网址?)

您将创建一个View Helper,然后使用$view->createUrl( $file )之类的内容,其中$ file包含构建URL所需的所有内容。所以你会得到你的对象路径,这是关键。

Can I keep my code generic to be able to switch from a local storage (at the beginning) to a cloud storage with the growth of the project?

不是真的。 Zend_Cloud尚未完全开发。 Zend_Cloud的想法是它可以与任何云存储适配器互换,但还没有准备好。

How do I optimize my assets for different devices/screen sizes? Can I still have only one source?

我创建了所有对象的不同大小。然后我把它添加到/123123123/large.jpg /123123123/medium.jpg

http://i.stack.imgur.com/AkT0B.jpg

File Manager