php - 采埃孚媒体 Assets 如何实现云存储?

标签 php zend-framework amazon-s3 cloud storage

我从未编写过任何云应用程序,所以我基本上是在研究以开始使用它。我在 Zend Framework 中开发,想使用云来存储媒体 Assets 。整个项目应该可以针对云进行扩展。想到这里,越来越多的问题涌上心头:

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

我想做的事情:

  1. 媒体 Assets 由记者上传
  2. 服务器将原始文件安全保存到云端(仅限受限 Assets )
  3. 服务器为网络准备图像(缩放、质量)并将其安全保存到云端
  4. 媒体与新闻文章相关联
  5. 新闻和相关媒体 Assets 由管理员发布或删除(不发布)
  6. 我想在资源发布后通过 CDN 分发它们。

我将非常感谢有关如何处理此项目的提示;-]

最佳答案

我会推荐 Amazon S3,它也是我一直在其上开发的。我也会从 AWS S3 的角度回答你的问题。

How do I handle access rights to the assets? (Public should only be able to access them if the according article is released. )

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

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

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

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

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

现在,ACL

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

但是,如果您将其上传为 ACL_PRIVATE,这意味着它是私有(private)的,只有文件的所有者才能访问它。

例子

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

a database to assign them to an article?)

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

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

在我们的情况下,我上周将 2 万张图片上传到 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;

How do I refer to them in zend framework? (Does it make sense to use a cdn like cloudfront? How to create urls?)

你会创建一个 View 助手,然后有类似 $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

关于php - 采埃孚媒体 Assets 如何实现云存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6943074/

相关文章:

php - 根据对象的属性对数组进行排序

php 从 mysql 数据库进行查询时出现错误,如 'where clause' 中的未知列

php - 如何在 zend 框架项目中包含 inc.php 文件?

amazon-web-services - 获取 s3 存储桶的模板

php - 我如何使用 MySQL 和整个 LAMP 处理每天 5M 事务?

php - 有没有办法强制 PHP 等待 MySQL 完成事务?

zend-framework - YouTube API : Private Video Access

php - 获取 PHPActiveRecord 结果作为简单数组,而不是对象数组

javascript - S3 上传 Excel 文件并通过签名 URL 下载

amazon-web-services - 为什么 CloudFront 会根据 Accept-Encoding 改变 CORS header 响应?