PHP CookBook: MyPHPTube.com (клонируем YouTube)

Categories: Estimation, Internet, PHP

MyPHPTube

С возросшей популярностью сервиса YouTube.com многим захотелось организовать подобный сервис, но как это сделать? Приведу небольшой рецепт организации такого сервиса.

Функциональность

Для начала опишем основной функционал сайта (сразу определимся и с ролями пользователей):

  1. Гость
    • просмотр видеофайлов на сайте
  2. Пользователь
    • аплоад видеофайлов
  3. Администратор
    • управление пользователями
    • управление файлами

WEB 2.0 фичи

А теперь расширем наш базовый функционал, чтобы привлечь аудиторию:

  1. Гость
    • просмотр комментариев к видеофайлам
    • поиск файлов (по категории, по тегам)
  2. Пользователь
    • возможность оставлять комментарии к видеофайлам
    • возможность записывать видеофайлы с web-камеры
    • возможность связывать видеоролик с категорией
    • возможность связывать видеоролик с несоклькими тегами (tags)
    • выставление рейтинга видеофайла
    • организация списка друзей
    • внутренняя mail система
    • закладки
  3. Администратор
    • управление комментариями
    • управление категориями

Это конечно не весь функционал YouTube, но ведь нужно с чего-то начинать

Конфигурация сервера

Наша система будет базироваться на LAMP:

  • Linux
  • Apache (версия 2.2 и выше)
  • MySQL (версия 5.0 и выше)
  • PHP (версия 5.2 и выше)

Возможные проблемы

А теперь расскажем о проблемах с которыми Вам предстоит столкнуться

Конвертирование Видео

Если позволить каждому из посетителей сайта заливать на сервер видеоролики в произвольном формате, то для того, чтобы просмотреть их все, Вам прийдется устанавливать на свой компьютер очень много кодеков, а если требовать определенный формат от пользователя – то, с очень большой вероятностью, это отпугнет от вашего сайта поситителей. И что же делать? Правильно, конвертировать все видеофайлы в один формат, и будем конфертировать в формат FLV (flash video – можно просматривать в большинстве операционных систем, поскольку он использует широко распространённый Adobe Flash Player и плагины к большинству браузеров, а также поддерживается многими программами для воспроизведения видео, например, MPlayer, VLC media player и другими программами, работающими с помощью DirectShow).

Нам понадобятся следующие програмные средства (всё opensource):

  1. mencoder или FFmpeg
  2. flvtool2 (требует наличия Ruby)
  3. PHP Program Package (‘example.php’ пример конвертации с использованием mencoder’a) или ffmpeg class (‘ffmpeg.example1.php’ пример конвертации с использованием ffmpeg)

Дополнительно можно еще использовать mplayer для получения информации о оригинальном видеоролике.

Замечательно, если мы всё установили и правильно собрали, то мы теперь можем конвертировать…

Статус загрузки

Еще такой момент – пользователям не нравиться сидеть и ждать пока файл загрузится на сервер, пользователь он же любознательный, ему хотя бы вывести progress bar надо:

Все ссылки нарыл на форуме xajax’a http://community.xajaxproject.org/viewtopic.php?pid=10100

Ресурсы

Так, на сервер мы залили видеофайл, показали как он быстро к нам заливался, но вот беда, если мы будем на нашем web-сервере конвертировать видео ролики – то сайт у нас будет скорее мёртв, чем жив. Для этой цели нам надо будет использовать еще один (как минимум) сервер, который будет забирать неотконвертированный файлы с web-сервера и отправлять назад отконвертированные ролики. Т.е. для решение данной проблемы нам понадобиться еще железо…

Распределение нагрузки

Конвертирование это ресурсоемко, а отдавать видеоролики всем желающим?… Это конечно не будет так нагружать процессор, но вот канал точно умрет… как выход у нас появляются еще сервера, которые и хранят у себя видеофайлы:

Как распределять нагрузку – это уже решать Вам. Но прежде, чем городить огород Вы должны определить какой приблизительно объем данных Вам прийдеться хранить, и далее уже решать какая схема больше подойдет, ориентируемся, что 1 пользователь заливает на сервер 20mb в месяц (234Gb на 1000 пользователей в год), не популярные ролики не сохраняются более года):

  • Объём данных ~ 0.3Tb – 1.5Tb:
    на каждом зеркале у нас хранятся все видеоролики
    у нас есть mirror1 – сервер на котором всегда первым появляется переконвертированный видеоролик, остальные с ним синхронизируются
  • Объём данных ~ 1.5Tb – 3 Tb:
    все видеоролики храняться только на одном главном сервере, если у видеоролика растет популярность, он заливается и на другие зеркала
  • Объём данных > 3Tb:
    видеролик заливается на ближайшее зеркало (подразумеваем, что ролик залитый китайцем будут смотреть в основном китайцы, следовательно заливаем его на зеркало в Китае)
    по мере роста популярности ролика зеркалим его на сервер ближайший к эпицетру популярности (пример: китаец живет в США, его ролик залит на зеркало расположенное в США, смотрят его в основном в Китае, видя это ролик будет отзеркален на Китайский сервер)

Числа взяты с потолка, против китайцев ничего не имею (просто взяты для примера), пишите свои варианты…

База данных

Далее я опишу простенькую архитектуру БД:

users
id autoincrement field
login unique login
password encrypt password
email user email
actcode activation code
role ENUM(guest/user/admin)
status not active / active / disable
date_create
date_update date of last change profile
date_login date of last login
another fields e.g. first name, last name

friends
id autoincrement field
user_id1 user ID
user_id2 user ID
status request / ok / cancel
date_create date of send request
date_update date of accept or denied request

files
id autoincrement field
title title of video file
file name of file on file system
status not convert / in process / ok
access public / members only / friends only / private
author_id ID of owner (users)
category_id ID of category (categories)
date_create
date_update date of last changes
another fields e.g. length, description

mirrors
id autoincrement field
url mirror url
date_create
date_update date of last changes

mirrors_link
file_id ID of file (files)
mirror_id ID of mirror (mirrors)
status current file status downloading / ok
date_create
date_update date of last changes

categories
id autoincrement field
pid parent category ID
name name of category
another fields e.g. metadescription, metakeywords

tags
id autoincrement field
word tag word

tags_link
id autoincrement field
tag_id tag ID (tags)
file_id file ID (files)

comments
id autoincrement field
author_id ID of owner (users)
file_id file ID (files)
message text of message
date_create

rate
id autoincrement field
author_id ID of owner (users)
file_id file ID (files)
rate integer value, e.g. for 0 to 10
date_create

messages
id autoincrement field
author_id ID of owner (users)
user_id ID of recipient (users)
type e.g. friend request-response / admin message
author_folder outbox/draft/delete
user_folder inbox/delete
user_status read or not
date_create

bookmarks
id autoincrement field
author_id ID of owner (users)
file_id file ID (files)
title title of link
description some description
date_create

Небольшое примечание:

  • для полей ввида date_create и date_update используем функцию gmdate(’Y-m-d H:i:s’) – время по Гринвичу, это облегчит в дальнейшем жизнь при отображении времени на сайте.

Команда

Какую лучше всего собрать команду для разработки такого проекта? Я предлагаю следующий вариант:

  • 2 PHP-разработчика
  • Flash разработчик / дизайнер
  • 1 администратор
  • 1 тестировщик
  • 1 менеджер

Оценка

Гость
Статические странички такие как “Contact Us”, “Terms of Use” etc. 1h/page
Поиск простенький поиск по нескольким параметрам 6h
Облако тэгов 8h
Просмотр видео FLV video player 16h
Просмотр комментариев 6h
Регистрация включая валидацию e-mail 12h
Напоминалка пароля 2h
Пользователь
Login/Logout 2h
Upload file 14h
Запись видео Необходим один из следующих серверов:

FMS, Wowza (from Feb 2007) or Red5 (opensource)
16h
Progress bar 16h
Добавление комментария 4h
Система рейтингов 2h
Закладки create/edit/delete 8h
Администратор
Управление пользователями Список пользователей, просмотр и редактирование профайлов 16h
Управление категориями 16h
Остальное
Дизайн 32h
Разработка БД 16h
Разработка архитектуры 32h
Хранилище файлов от 8h до 96h 8h
Конвертирование видеофайлов 20h
Итого
Настройка серверов web-server, convert-server, mirrors 40h
Разработка 256h
Тестирование 30%-50% от разработки 85h
Менеджмент 10% минимум 40h
Итого: 421h

Да уж, не мало – 421 часа, т.е. примерно 2,5 месяца разработки… и это еще очень оптимистическая оценка, с учётом, что разработчики используют свои наработки или какую-либо CMF систему аналогичную Zend Framework или phpXCore, а так же организовываем простейшее хранилище файлов. Если же разработка будет вестись с нуля – то можно смело умножать данную оценку на 2.


Итого, такой проект будет стоить не менее $10 000…

P.S.

Основная проблема не в реализации системы, а в привличениии аудитории, кто будет пользоваться вашим сервисом если есть YouTube (и даже PornoTube)? Чем завлечь? Если есть идеи – пишите каменты…

На момент написания статьи домен MyPHPTube.com не был зарегистрирован, если вы его таки зарегистрировали, вышлете пива на мой домашний адрес… ;)

Есть несколько причин побудивших написать данную статью:

  1. хотелось написать умную статью для своего блога (или претендующую на “умную”)
  2. хотелось показать, что Package Program таки может пригодиться
  3. продемонстрировать, что OpenSource и LAMP тоже рулит ;)

This entry was posted on Monday, July 2nd, 2007 at 18:53 and is filed under Estimation, Internet, PHP.
You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

Другие посты на эту тему

27 Responses to “PHP CookBook: MyPHPTube.com (клонируем YouTube)”

  1. Chex

    А не знаешь какой нить опенсорсник flash плеера для реализации подобного?

  2. [...] данная тема, могу посоветовать прочитать еще статейку о клоне YouTube. Tags: Estimation | March 5th, 2008 | 1 [...]

  3. Антон, обрати внимание на раздел «Ресурсы», конец предпоследнего предложения:
    «…с web-сервера и ложить назад отконвертированные ролики.», гораздо лучше правильнее звучит так:
    «…с web-сервера и КЛАСТЬ (или отправлять) назад отконвертированные ролики.»

  4. Да, статья отличная!
    Five баллов!

  5. to Drendt:
    спс, исправил, а то действительно, как-то криво было…

  6. [...] проекты. Плюс неплохой набросок “MyPHPTube.com (клонируем YouTube)“. По данной теме написано очень много книг и [...]

  7. продемонстрировать, что OpenSource и LAMP тоже рулит

    Рулить то рулит, но для описанной задачи совершенно не критична ни версия апача ни версия РНР ни вообще наличие апача а не например nginx

  8. Есть готовый хороший скрипт для организации Youtube.
    http://www.clip-share.com/

    Так что всё намного дешевле.
    А вот то, что можно найти 6 квалифицированных человек, которые могут трудится 2,5 месяца за $10 000 я очень сомневаюсь

  9. to Сергей Каменев:
    Видели мы это счастье :)
    Был клиент, который купил такое “готовое” решение, он еще пару месяцев доводил сие творение до ума…

  10. [...] PHP CookBook: MyPHPTube.com (клонируем YouTube) [...]

  11. Основная проблема не в реализации системы? Ну кому как. Идей куча, но вот технической смекалки у меня нет, чтобы организовать столько людей :(

  12. Татьяна

    Доброе утро Антон, очень понравилась ваша статья про создание сайта на подобии Ютуба. У меня ж в проекте, кот я делаю тоже стоит вопрос конвертации видео из всех форматов в flv, я вот что вы посоветовали скачала, но теперь не знаю как мне все это соеденить, чтоб работало. Вы не могли бы оказать услугу и помочь в этом нелегком деле. А то я сама чувствую долго до всего этого буду доходить. Я скачала ffmpeg,PHP Program Package – вот касаемо этого пакета, тут все что нужно или надо отдельно подключать библиотеку ffmpeg??

  13. Для начала – есть два способа конвертации:
    mencoder+PHP Program Package
    либо
    FFmpeg+ffmpeg class
    после конвертации в любом случае прийдеться обработать видеоролик с помощью flvtool2 – чтобы флешпроигрыватель адекватно работал

    Советую вначале попробывать просто сконвертировать видеоролик в FLV используя данные утилиты (без PHP), и затем уж используя функцию exec конвертировать с помощью PHP

  14. Архитектура YouTube…

    Рост YouTube был феноменально быстр, количество просмотров видео превысило 100 миллионов в сутки при том, что только около пяти человек работа…

  15. Sergei

    Скажите Антон, а поставить эти средства под винду можно?,- а то кидаться из-за конвертации видео на Linux как то нет желания.

  16. @Sergei:
    Да – это вполне возможно, по крайней мере mencoder под windows я тестировал, flvtool2 так же запускается, правда я с ней не работал…

  17. Alex

    “to Сергей Каменев:
    Видели мы это счастье :)
    Был клиент, который купил такое “готовое” решение, он еще пару месяцев доводил сие творение до ума”

    это точно. скрипт дырявый. глючный. пока переведешь его на русский весь перероешь.

  18. [...] PHP CookBook: MyPHPTube.com (клонируем YouTube) – 1 755 – 00:04:27 [...]

  19. AngelOK

    Хотел поинтересоваться.
    У кого-нибудь получилось что-либо сделать по данному руководству к действию? :)

  20. rchumak

    Клиент год назад купил решение от http://www.clip-share.com/, что бы прикрутить к готовому проекту.
    В результате за две недели одним человеком было написано нужное решение на основе существующей на нашем проекте фотогалереи.
    Из http://www.clip-share.com/ взяли тока идеи конвертации видео, создание скриншотов и Flash-плеер.

  21. rchumak

    И еще …
    Судя, по коментарием в коде, ClipShare писан на Украине под заказ из Канади

  22. Антон Юрьевич/
    Заманчиво, заманчиво.
    Свяжитесь с нами http://russtv.ru/inhtml/uzer2.shtml
    Есть в общем мысли. Покупать ClipShare нет никакого желания.

  23. Вова

    Поле email (user email) тоже должно быть уникальным :)

  24. Volhov

    Антон, подскажите плиз, а вот эти сервера: FMS, Wowza (from Feb 2007) or Red5 (opensource) когда необходимо использовать, или загрузку и конвертацию видео можно организовать и без них?

  25. @Volhov:
    Для загрузки и конвертации данные сервера не нужны…

  26. Статья интересная, но мне кажется для реального проекта заинтересованого в предоставлении видео контента важнее продумать именно способ хранения и отдачи видео роликов (CDN), а не систему кодирования и веб-интерфейс.

Leave a Reply

Copyright © 2007-2010, Anton Shevchuk. Powered by WordPress

MAXCACHE: 0.26MB/0.00039 sec