phpフレームワークlaravel 5でのサービスリニューアル実例
TRANSCRIPT
PHP フレームワーク Laravel 5 でのサービスリニューアル実例
2015/07/14 @ヒカ☆ラボ
自己紹介杉山 隆( Takashi Sugiyama )@best_not_best
Python, PHP
2008/04 〜 2013/03 : ヤフー株式会社
2013/04 〜 2015/03 : 株式会社アイ・エム・ジェイ
2015/04 〜 : 株式会社インテリジェンスdots. 開発リーダー
dots.http://eventdots.jp/
エンジニアのためのイベント情報検索サービス
2013 年 10 月リリース
ユーザー数 20,000 人突破!!
dots.
各種イベントサービス API (一部はページを直接スクレイピング)からイベント情報を取得。(全イベントの約 9 割)
取得したイベントは本文を形態素解析して、自動でタグ付け
dots. 主催のイベントも 1 割ほどある
dots.CakePHP + Nginx + Apache + mod_php + MariaDB … 等
dots.
コードが汚い!!
dots.
もともと外注
消えることの無い「 TODO 」コメント
大量のコメントアウト
View の大半を占める「 <?...?> 」
Unit テスト?何それ?
運用しづらい・・・
dots.
よろしい
ならばリニューアルだ
リニューアルにおける前提
「エンジニア」のためのサービスなのだから、エンジニアから見てイケてる技術を使おう!
新しい技術に挑戦したい!
決して「 CakePHP がイケてない」というわけではないです(とても重要)
FW 選定にあたって
。
Laravel
ウェブ職人のための PHP フレームワーク
Best PHP Frameworks for 2014cf. http://www.sitepoint.com/best-php-frameworks-2014/
名前は「ナルニア国物語」からcf. http://www.slideshare.net/KenichiMukai/php-study74
今回話すこと
dots. のサーバ構成、アプリケーション構成
導入したモジュール … 等
今回話さないこと
Laravel の基本機能や artisan コマンドについて
→ 直接お声掛けください。
サーバ構成
ファイル構成Web 、 Admin 、 Batch で同じ repository を使用
Controller
ルーティングroute.php でドメインによってルーティング指定
// Set environmentswitch (getenv('APP_ENV')) { case 'production': $env = ''; break; case 'staging': $env = 'stg.''; ...}Route::group([ 'namespace' => 'Web', 'domain' => $env . 'eventdots.jp', ], function () { Route::get('/', ['as' => 'web.event.index', 'uses' => 'EventController@index]); (中略) });
ファイル構成View
レンダリングコントローラから
$this->render('index’);
または
View::make('web.index');
で呼び出す。
Laravel for Web Application
ルーティングswitch (getenv('APP_ENV')) { case 'production': $env = ''; $https = 'https'; break; ...}
Route::group([ 'namespace' => 'Web', 'domain' => $env . 'eventdots.jp', ‘middleware’ => [‘csrf’, 'cors']], function () use ($https) { Route::get('/', ['as' => 'web.event.index’, 'uses' => 'EventController@index', 'http']); });
ルーティングswitch (getenv('APP_ENV')) { case 'production': $env = ''; $https = 'https'; break; ...}
Route::group([ 'namespace' => 'Web', 'domain' => $env . 'eventdots.jp', ‘middleware’ => [‘csrf’, 'cors']], function () use ($https) { Route::get('/', ['as' => 'web.event.index’, 'uses' => 'EventController@index', 'http']); });
ルーティング
プロコトルを指定
指定外のプロトコルでアクセスしようとすると、指定されたプロトコルの URL にリダイレクトされる。
本番環境以外は、オレオレ証明書を使っていることもあるため、環境によってプロトコル指定。(オレオレの環境で https 指定すると 404 になる・・・。)
ルーティングswitch (getenv('APP_ENV')) { case 'production': $env = ''; $https = 'https'; break; ...}
Route::group([ 'namespace' => 'Web', 'domain' => $env . 'eventdots.jp', ‘middleware’ => [‘csrf’, 'cors']], function () use ($https) { Route::get('/', ['as' => 'web.event.index’, 'uses' => 'EventController@index', 'http']); });
ルーティングミドルウェア
全てのルートで CSRF 対策( Illuminate\Foundation\Http\Middleware\VerifyCsrfToken )と CORS 設定を追加
CSRF
Illuminate\Foundation\Http\Middleware\VerifyCsrfToken を使用
CORS
cf. https://github.com/barryvdh/laravel-cors
ルーティングミドルウェア名は app/Http/Kernel.php で設定
protected $routeMiddleware = [
'csrf'
=> 'Illuminate\Foundation\Http\Middleware\VerifyCsrfToken',
'web.auth'
=> 'Dots\Http\Middleware\WebAuthenticate',
'web.guest'
=> 'Dots\Http\Middleware\RedirectIfWebAuthenticated',
...
];
ソーシャルログイン
Laravel Socialite
cf. https://github.com/laravel/socialite
以下のようにして実装。
Socialite::with($socialType)->redirect();
ログ
monolog + FluentHandlercf. https://github.com/dakatsuka/MonologFluentHandler
fluentd を使って IDCF のオブジェクトストレージへ。(本番環境のみ)
画像ファイル管理ツールからアップロードされた画像ファイルも IDCF のオブジェクトストレージへcf. https://github.com/aws/aws-sdk-php-laravelconfig/filesystems.php で以下のように設定
'disks' => [ 'private' => [ 'local' => [ 'driver' => 'local', 'root' => env('PRIVATE_LOCAL_ROOT', storage_path() . '/app'), ], 's3' => [ 'driver' => 's3', 'key' => env('STORAGE_KEY'), 'secret' => env('STORAGE_SECRET'), 'base_url' => env('STORAGE_BASE_URL'), 'bucket' => env('PRIVATE_BUCKET'), ], ], 'public' => [ .... ],],
Laravel for Batch
Laravel for Batch
特別なことは特にしていない
Artisan scheduler で cron 設定
Queue で非同期処理
外部イベント取得処理、メール配信処理を実行
Laravel に機能が充実している
その他
Web サービス構築に必要な機能は大抵そろっている( Redis 、 Cache 、 Cashier 等)
かゆい所に手がとどく関数がたくさんある( camel_case(), srt_limit() )
メンテナンスモードへの切り替え機能もある
要検証
メモリの問題cf. http://blog.a-way-out.net/blog/2015/03/26/php-framework-benchmark/
dots.2015 年 8 月リニューアル予定
絶賛テスト中!
今後やること
イベントのタグ付け(分類、形態素解析)の精度向上
そもそもバッチは PHP で良いのか・・・?
アクセスログや Google Analytics のデータを使ったデータ解析基盤の構築
and more...
イベント・コワーキングスペース dots.
2015 年 8 月オープン予定
渋谷駅 ハチ公口から徒歩 3 分
最大収容人数 約 200 名(着席)
http://eventdots.jp/space
イベント・コワーキングスペース dots.
※画像はイメージです。
ご清聴ありがとうございました。