Как реализовать облачное хранилище для медиаресурсов в ZF? - PullRequest
2 голосов
/ 04 августа 2011

Я никогда не программировал ни одно облачное приложение, поэтому я в основном исследую его. Я занимаюсь разработкой в ​​Zend Framework и хочу использовать облако для хранения медиаресурсов. Весь проект должен быть масштабируемым для облака. Размышляя об этом, у меня возникает все больше вопросов:

  • Какой поставщик услуг хранения вы бы порекомендовали?
  • Как мне обращаться с правами доступа к активам? (Public должен иметь доступ к ним, только если опубликована соответствующая статья.)
  • Как мне отслеживать все активы? (Соглашения об именах? Создать базу данных, чтобы назначить их статье?)
  • Как я могу ссылаться на них в Zend Framework? (Имеет ли смысл использовать cdn, как cloudfront? Как создавать URL-адреса?)
  • Могу ли я сохранить общий код для возможности переключения с локального хранилища (в начале) на облачное хранилище по мере роста проекта?
  • Как оптимизировать мои активы для разных устройств / размеров экрана? Могу ли я иметь только один источник?

Что я хочу сделать:

  1. Медиа Актив загружен журналистом
  2. Сервер сохраняет оригинальный файл в облаке (только ограниченный ресурс)
  3. Сервер подготавливает изображение для Интернета (масштабирование, качество) и сохраняет его в облаке
  4. СМИ связаны с новостной статьей
  5. Новости и связанные медиаресурсы выпускаются или удаляются (без публикации) администратором
  6. Я хочу распространить ресурсы через CDN, если они получат релиз.

Я был бы очень благодарен за подсказки о том, как заняться этим проектом; -]

1 Ответ

7 голосов
/ 04 августа 2011

Я бы порекомендовал Amazon S3, это также то, что я разрабатывал поверх.Я также отвечу на ваш вопрос с точки зрения AWS S3.

Как мне обращаться с правами доступа к активам?(Public должен иметь доступ к ним только в случае публикации соответствующей статьи.)

Когда файлы загружаются в Amazon S3, вы можете выбрать политику доступа.Вы также можете установить политику доступа к каждому файлу во всей «корзине».Bucket - это уникальное имя, используемое для обозначения вашего хранилища на основе «облака».Каждый файл в корзине доступен по одному ключу.

Например, вы загружаете файл с именем 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, либо постоянно проверять API Amazon S3, чтобы выяснить, какие файлы у вас есть.Вы будете знать, что вам нужно на основе вашего приложения.

Возьмите ситуацию, которая у меня возникла ... Изображение загружается в файловый менеджер нашей компании, затем автоматически генерируются три эскиза, а затем применяются водяные знаки.Это означает, что каждое изображение может генерировать как минимум 3 изображения и до сотен (в зависимости от того, сколько различных водяных знаков нам нужно применить).

В нашей ситуации на прошлой неделе я загрузил 20 тыс. Изображений в 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 Framework?(Имеет ли смысл использовать cdn, как cloudfront? Как создавать 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?

Не совсем.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

...