Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

XECon2015 :: [2-5] 변용훈 - Laravel 동영상 서비스 만들기

608 views

Published on

Laravel로 동영상 서비스를 개발한 경험을 공유합니다. 동영상 썸네일 및 포맷 변환, iron_mq를 이용한 비동기 실행, thumbor를 이용한 이미지 리사이징, ELK를 이용한 로깅 등에 대해서 설명합니다.

Published in: Software
  • Be the first to comment

XECon2015 :: [2-5] 변용훈 - Laravel 동영상 서비스 만들기

  1. 1. 1 / 40
  2. 2. @river ASP,  PHP(CodeIgniter ‑> Laravel),  Magento Laravel Korea 페이스북 그룹 https://laravelrocks.com  About Me # 2 / 40
  3. 3. Agenda php artisan route:list What How Some Tips Wrap Up 3 / 40
  4. 4. What ? composer require 동영상/동영상 4 / 40
  5. 5. 동영상 서비스 5 / 40
  6. 6. 동영상 서비스 6 / 40
  7. 7. 동영상 서비스 7 / 40
  8. 8. 동영상 서비스 8 / 40
  9. 9. 동영상 서비스 9 / 40
  10. 10. How ? 10 / 40
  11. 11. 개발환경 php artisan down Laravel 5.1 Homestead phpstorm yobi phpunit, codeception 11 / 40
  12. 12. 동영상 처리 업로드된 동영상 파일에서  스냅샷   이미지 생성하고, mpeg4로 변환 12 / 40
  13. 13. FFmpeg 동영상 정보 구하기 스냅샷 이이지 생성 동영상 컨버팅 빌드 H.264 video encoder, AAC audio encoder, MP3 audio encoder, ... https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu ffprobe,  ffmpeg 13 / 40
  14. 14.  php‑ffmpeg/php‑ffmpeg 패키지 $ffprobe = FFMpegFFProbe::create(); $ffprobe ->format('video.avi') ->get('duration'); // returns the duration property $ffmpeg = FFMpegFFMpeg::create(); $video = $ffmpeg->open('video.avi'); $video ->frame(FFMpegCoordinateTimeCode::fromSeconds(10)) ->save('frame.jpg'); // saves snapshot image $video ->save(new FFMpegFormatVideoX264(), 'video.mp4'); 14 / 40
  15. 15. 동영상 변환 대기 시간 15 / 40
  16. 16. 비동기 처리 Laravel queue driver : database, Beanstalkd, IronMQ, Amazon SQS, Redis, sync IronMQ  16 / 40
  17. 17. IronMQ 클라우드 기반의 메시지 큐 웹서비스 회원 가입 및 프로젝트 생성 ‑> token 발급 1M API Requests/Month Free Pull Queue / Push Queue 17 / 40
  18. 18. IronMQ ‑ Config package.json "iron-io/iron_mq": "2.*" .env QUEUE_DRIVER=iron config/queue.php 'iron' => array( 'driver' => 'iron', 'host' => 'mq-aws-us-east-1.iron.io', 'token' => '[YOUR TOKEN]', 'project' => '[YOUR PROJECT ID]', 'queue' => 'video', 'encrypt' => false, ), 18 / 40
  19. 19. IronMQ ‑ Job Class app/Jobs/ConvertVideo.php class ConvertVideo extends Job implements SelfHandling, ShouldQueue { use InteractsWithQueue, SerializesModels; private $video; public function __construct(Video $video) { $this->video = $video; } public function handle(VideoRepo $videoRepo) { // Convert video ... } } 19 / 40
  20. 20. IronMQ ‑ Controllers, Route, Middleware app/Http/Controllers/VideosController.php // 동영상 변환 큐잉 $this->dispatch(new ConvertVideo($video)); // 큐 이름 지정 방법 $job = (new ConvertVideo($video))->onQueue('video'); $this->dispatch($job); app/Http/routes.php // IronMQ에서 불려짐 Route::post('queue/video', function () { return Queue::marshal(); }); app/Http/Middleware/VerifyCsrfToken.php // 제외 route protected $except = [ 'queue/video', ]; 20 / 40
  21. 21. IlluminateQueueQueue protected function createPayload($job, $data = '', $queue = null) { ... return json_encode([ 'job' => 'IlluminateQueueCallQueuedHandler@call', 'data' => ['command' => serialize(clone $job)], ]); ... } IlluminateQueueCallQueuedHandler public function call(Job $job, array $data) { $command = $this->setJobInstanceIfNecessary( $job, unserialize($data['command']) ); ... } [command] => O:21:"AppJobsConvertVideo":4:{s:28:"AppJobsConvertVideovideo"; O:45:"IlluminateContractsDatabaseModelIdentifier":2: {s:5:"class";s:17:"EcplazaEmpVideo";s:2:"id";i:143;} s:5:"queue";N;s:5:"delay";N;s:6:"*job";N;} 21 / 40
  22. 22. IronMQ ‑ public URL IronMQ가 접근할 수 있도록  queue/video를 공개 finch, ngrok $ npm install --global finch $ finch login $ finch forward http://video.dev → Requesting connection... ✔ → Establishing secure connection... ✔ The following sites are now being forwarded. Press CTRL+C at any time to end your session: ----------------------------------------------------- | Public URL | Private URL | ----------------------------------------------------- | https://worm-large.usefinch.io | http://video.dev | ----------------------------------------------------- 22 / 40
  23. 23. IronMQ ‑ Subscribe Add subscriber 또는 php artisan queue:subscribe video https://worm-large.usefinch.io/queue/video 23 / 40
  24. 24. 데모 동영상 0:39 24 / 40
  25. 25. IronMQ ‑ Testing Job 테스팅시는  sync로 .env QUEUE_DRIVER=sync 25 / 40
  26. 26. IronMQ 비동기 처리 로직 분리 스케일러블 구성할 때 할 일이 많다. 디버깅이 힘들다. 26 / 40
  27. 27. 스냅샷 이미지 리사이징 스냅샷   이미지에서  리스트용,  재생 포스터용 등 필요한 크기의 이미지 생성 27 / 40
  28. 28. Intervention 사용해서 구현 단점 썸네일 사이즈가 변경되거나 새로운 사이즈의 썸네일이 필요한 경우 일괄 신규 생성 미사용 썸네일 삭제 웹 애플리케이션마다 이미지 처리 중복 구현 이미지 처리 레이어 분리 이미지 처리 전용 서버를 찾아보자 28 / 40
  29. 29. http://thumbor.org/ https://github.com/thumbor/thumbor 29 / 40
  30. 30. thumbor 30 / 40
  31. 31. thumbor 이미지 처리(리사이징, 필터링, 얼굴인식 등) 및 캐시 서버 웹 애플리케이션에서 이미지 처리 레이어를 분리 동적 생성. 원하는 크기의 이미지를 언제라도 사용 가능 WebP detect 31 / 40
  32. 32. thumbor http://thumbor‑server/unsafe/ widthx height/ host/ path  ceejayoz/laravel‑phumbor 패키지 사용 Phumbor::url('http://images.example.com/foo.jpg') ->resize(300, 200) ->addFilter('fill', 'green'); 32 / 40
  33. 33. 참 쉽죠 ! 33 / 40
  34. 34. 유사 서비스 Imgix Thumbr.io Cloudinary Huluma LibPixel WeServe 34 / 40
  35. 35. Front Bootstrap, jQuery Video player : videojs Javascript loader : RequireJS Task runner : gulp 35 / 40
  36. 36. php artisan up 36 / 40
  37. 37. ELK를 이용한 실시간 로그 모니터링 AppHttpMiddlewareAttachLogstash UptimeRobot class AttachLogstash { public function handle($request, Closure $next) { if (App::environment() !== 'testing') { $monolog = Log::getMonolog(); $redis = new RedisHandler( Redis::connection(), config('logstash'), Logger::INFO ); $formatter = new MonologFormatterLogstashFormatte $redis->setFormatter($formatter); $monolog->pushHandler($redis); } return $next($request); } } Some Tips # 37 / 40
  38. 38. Wrap Up php artisan optimize FFMpeg Laravel Queue IronMQ Thumbor 38 / 40
  39. 39. Reference FFMpeg build IronMQ and Laravel: Setup Best Thumbnailing Solution ‑ Set up Thumbor on AWS 이미지 썸네일 생성에 관하여 (thumbor) redis, logstash, elasticsearch, kibana를 이용해서 실시간 로그 모니터링 하기 39 / 40
  40. 40. php artisan serve 슬라이드 http://yhbyun.github.io/laravel‑video 40 / 40

×