phpフレームワークlaravel 5でのサービスリニューアル実例

Post on 15-Aug-2015

175 Views

Category:

Technology

6 Downloads

Preview:

Click to see full reader

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.

※画像はイメージです。

ご清聴ありがとうございました。

top related