xecon2015 :: [2-5] 변용훈 - laravel 동영상 서비스 만들기
TRANSCRIPT
1 / 40
@river
ASP , PHP (CodeIgniter ‑> Laravel), Magento
Laravel Korea 페이스북 그룹
https://laravelrocks.com
About Me#
2 / 40
Agendaphp artisan route:list
What
How
Some Tips
Wrap Up
3 / 40
What ?composer require 동Ý상/동Ý상
4 / 40
동«상 Áæ스
5 / 40
동«상 Áæ스
6 / 40
동«상 Áæ스
7 / 40
동«상 Áæ스
8 / 40
동«상 Áæ스
9 / 40
How ?10 / 40
개발환경php artisan down
Laravel 5.1
Homestead
phpstorm
yobi
phpunit, codeception
11 / 40
동영상 처리업ø드´ 동«상 Ã일에Á 스냅샷 � 이미지 생Ö하고,
mpeg4ø 변환
12 / 40
FFmpeg동«상 Á보 ý하Â
스냅샷 이이지 생Ö
동«상 컨버¼
î드
H.264 video encoder, AAC audio encoder, MP3 audio encoder, ...
https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu
ffprobe , ffmpeg
13 / 40
� 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
동영상 변환 대기 시간 �
15 / 40
æ동Â 처리Laravel queue driver : database, Beanstalkd, IronMQ, Amazon SQS, Redis,
sync
IronMQ
16 / 40
IronMQ클라우드 ¸의 ò시지 큐 웹Áæ스
회원 가입 ¯ ½øÉ트 생Ö ‑> token ¼�
1M API Requests/Month Free
Pull Queue / Push Queue
17 / 40
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
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
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
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
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
IronMQ ‑ SubscribeAdd subscriber
ª는
php artisan queue:subscribe video https://worm-large.usefinch.io/queue/video
23 / 40
데모 동«상
0:39
24 / 40
IronMQ ‑ TestingJob 테스¼시는 syncø
.env
QUEUE_DRIVER=sync
25 / 40
IronMQ
æ동Â 처리
ø직 분리
스³일러¶
ýÖ할 å 할 일이 많다.
버×이 힘들다.
26 / 40
스냅샷 이미지 리사이징스냅샷 � 이미지에Á 리스트용 , 재생 포스터용 등
ý요한 크Â의 이미지 생Ö
27 / 40
� Intervention 사용해서 구현
단¼
썸¹일 사이즈가 변경°거나 새ø운 사이즈의 썸¹일이 ý요한 경우
일� 신규 생Ö
미사용 썸¹일 삭È
웹 애Å리³이ý마다 이미지 처리 ¾복 ý¾
이미지 처리 ¤이어 분리
이미지 처리 전용 서버를 찾아보자 �
28 / 40
http://thumbor.org/
https://github.com/thumbor/thumbor
29 / 40
thumbor이미지 처리(리사이징, ýå링, 얼굴인식 등) ¯ 캐시 Á버
웹 애Å리³이ý에Á 이미지 처리 ¤이어를 분리
동 생Ö. 원하는 크Â의 이미지를 언È라도 사용 가능
WebP detect
31 / 40
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
참 쉽죠 !
33 / 40
유사 서비스Imgix
Thumbr.io
Cloudinary
Huluma
LibPixel
WeServe
34 / 40
FrontBootstrap, jQuery
Video player : videojs
Javascript loader : RequireJS
Task runner : gulp
35 / 40
php artisan up
36 / 40
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
Wrap Upphp artisan optimize
FFMpeg
Laravel Queue
IronMQ
Thumbor
38 / 40
ReferenceFFMpeg build
IronMQ and Laravel: Setup
Best Thumbnailing Solution ‑ Set up Thumbor on AWS
이미지 썸¹일 생Ö에 �하여 (thumbor)
redis, logstash, elasticsearch, kibana를 이용해Á 실시간 ø그 모니å링 하Â
39 / 40
php artisan serve슬라이드 http://yhbyun.github.io/laravel‑video
40 / 40