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

Man*_*uel 2 php cloud storage zend-framework amazon-s3

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

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

我想做的事:

  1. 媒体资产由记者上传
  2. 服务器将原始文件保存到云端(仅限受限资产)
  3. 服务器为Web准备图像(缩放,质量)并将其保存到云端
  4. 媒体与新闻文章相关联
  5. 管理员发布或删除(不发布)新闻和相关媒体资产
  6. 如果资产获得发布,我想通过CDN分发资产.

我非常感谢有关如何解决这个项目的提示; - ]

Lay*_*yke 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
Run Code Online (Sandbox Code Playgroud)

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

所以你有几个选择.您可以缓存所有内容以存储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;
Run Code Online (Sandbox Code Playgroud)

我如何在zend框架中引用它们?(使用类似cloudfront的cdn是否有意义?如何创建URL?)

您将创建一个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?
Run Code Online (Sandbox Code Playgroud)

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

How do I optimize my assets for different devices/screen sizes? Can I still have only one source?
Run Code Online (Sandbox Code Playgroud)

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

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

文件管理器