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

40

Upload: xpressengine

Post on 16-Apr-2017

448 views

Category:

Software


5 download

TRANSCRIPT

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

1 / 40

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

@river

ASP , PHP (CodeIgniter ‑> Laravel), Magento

Laravel Korea  페이스북 그룹

https://laravelrocks.com 

About Me#

2 / 40

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

Agendaphp artisan route:list

What

How

Some Tips

Wrap Up

3 / 40

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

What ?composer require 동Ý상/동Ý상

4 / 40

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

동«상 Áæ스

5 / 40

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

동«상 Áæ스

6 / 40

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

동«상 Áæ스

7 / 40

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

동«상 Áæ스

8 / 40

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

동«상 Áæ스

9 / 40

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

How ?10 / 40

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

개발환경php artisan down

Laravel 5.1

Homestead

phpstorm

yobi

phpunit, codeception

11 / 40

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

동영상 처리업ø드´ 동«상 Ã일에Á 스냅샷  �  이미지 생Ö하고,

mpeg4ø 변환

12 / 40

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

FFmpeg동«상 Á보 ý하Â

스냅샷 이이지 생Ö

동«상 컨버¼

î드

H.264 video encoder, AAC audio encoder, MP3 audio encoder, ...

https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu

ffprobe , ffmpeg

13 / 40

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

� php‑ffmpeg/php‑ffmpeg ß키지$ffprobe = FFMpeg\FFProbe::create();$ffprobe ->format('video.avi') ->get('duration'); // returns the duration property

$ffmpeg = FFMpeg\FFMpeg::create();$video = $ffmpeg->open('video.avi');$video ->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(10)) ->save('frame.jpg'); // saves snapshot image

$video ->save(new FFMpeg\Format\Video\X264(), 'video.mp4');

14 / 40

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

동영상 변환 대기 시간 �

15 / 40

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

æ동 처리Laravel queue driver : database, Beanstalkd, IronMQ, Amazon SQS, Redis,

sync

IronMQ 

16 / 40

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

IronMQ클라우드 Â¸의 ò시지 큐 웹Áæ스

회원 가입 ¯ ½øÉ트 생Ö ‑> token ¼�

1M API Requests/Month Free

Pull Queue / Push Queue

17 / 40

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

IronMQ ‑ Configpackage.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

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

IronMQ ‑ Job Classapp/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

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

IronMQ ‑ Controllers, Route, Middlewareapp/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

// 제외 routeprotected $except = [ 'queue/video',];

20 / 40

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

Illuminate\Queue\Queue

protected function createPayload($job, $data = '', $queue = null){ ... return json_encode([ 'job' => 'Illuminate\Queue\CallQueuedHandler@call', 'data' => ['command' => serialize(clone $job)], ]); ...}

Illuminate\Queue\CallQueuedHandler

public function call(Job $job, array $data){ $command = $this->setJobInstanceIfNecessary( $job, unserialize($data['command']) );

...}

[command] => O:21:"App\Jobs\ConvertVideo":4:{s:28:"App\Jobs\ConvertVideovideo";O:45:"Illuminate\Contracts\Database\ModelIdentifier":2:{s:5:"class";s:17:"Ecplaza\Emp\Video";s:2:"id";i:143;}s:5:"queue";N;s:5:"delay";N;s:6:"*job";N;}

21 / 40

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

IronMQ ‑ public URLIronMQ가 ½근할 ¾ 있도ù 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 anytime to end your session:

-----------------------------------------------------| Public URL | Private URL |-----------------------------------------------------| https://worm-large.usefinch.io | http://video.dev |-----------------------------------------------------

22 / 40

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

IronMQ ‑ SubscribeAdd subscriber

ª는

php artisan queue:subscribe video https://worm-large.usefinch.io/queue/video

23 / 40

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

데모 동«상

0:39

24 / 40

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

IronMQ ‑ TestingJob 테스¼시는 syncø

.env

QUEUE_DRIVER=sync

25 / 40

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

IronMQ

æ동 처리

ø직 분리

스³일러¶

ýÖ할 å 할 일이 많다.

­버×이 힘들다.

26 / 40

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

스냅샷 이미지 리사이징스냅샷  �  이미지에Á 리스트용 , 재생 포스터용  등

ý요한 크Â의 이미지 생Ö

27 / 40

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

� Intervention 사용해서 구현

단¼

썸¹일 사이즈가 변경°거나 새ø운 사이즈의 썸¹일이 ý요한 경우

일� 신규 생Ö

미사용 썸¹일 삭È

웹 애Å리³이ý마다 이미지 처리 ¾복 ý¾

이미지 처리 ¤이어 분리

이미지 처리 전용 서버를 찾아보자 �

28 / 40

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

http://thumbor.org/

https://github.com/thumbor/thumbor

29 / 40

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

thumbor

30 / 40

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

thumbor이미지 처리(리사이징, ýå링, 얼굴인식 등) ¯ 캐시 Á버

웹 애Å리³이ý에Á 이미지 처리 ¤이어를 분리

동­ 생Ö. 원하는 크Â의 이미지를 언È라도 사용 가능

WebP detect

31 / 40

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

thumborhttp://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

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

참 쉽죠 !

33 / 40

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

유사 서비스Imgix

Thumbr.io

Cloudinary

Huluma

LibPixel

WeServe

34 / 40

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

FrontBootstrap, jQuery

Video player : videojs

Javascript loader : RequireJS

Task runner : gulp

35 / 40

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

php artisan up

36 / 40

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

ELK를 이용한 실시간 ø그 모니å링

App\Http\Middleware\AttachLogstash

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 \Monolog\Formatter\LogstashFormatter( $redis->setFormatter($formatter); $monolog->pushHandler($redis); }

return $next($request); }}

Some

Tips

#

37 / 40

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

Wrap Upphp artisan optimize

FFMpeg

Laravel Queue

IronMQ

Thumbor

38 / 40

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

ReferenceFFMpeg build

IronMQ and Laravel: Setup

Best Thumbnailing Solution ‑ Set up Thumbor on AWS

이미지 썸¹일 생Ö에 �하여 (thumbor)

redis, logstash, elasticsearch, kibana를 이용해Á 실시간 ø그 모니å링 하Â

39 / 40

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

php artisan serve슬라이드 http://yhbyun.github.io/laravel‑video

40 / 40