Slide 1

Slide 1 text

Laravelでサー ビスを作った 時にやった こと

Slide 2

Slide 2 text

自己紹介 Twitter: dala00 個人で色々とサービスを作っている(去年は5つ+α、今年も1つ) PHPメインだけどNode.js、Elixir、Firebase等何でも使ってリリースしたりする

Slide 3

Slide 3 text

作ったもの CrieitというQiitaのようだけど ポエムでも何でも書ける記事投稿サービス ● Laravel ● Vue.js ● Bootstrap Material Design

Slide 4

Slide 4 text

開発環境構築

Slide 5

Slide 5 text

docker-compose.yml いくつかのプロジェクトがあると バージョンが変わって辛いため

Slide 6

Slide 6 text

Vue.jsとの連携

Slide 7

Slide 7 text

全体を囲んでどこにでも コンポーネントを置けるようにする ● scriptタグはappの外だけ使える

Slide 8

Slide 8 text

jsonにすれば直接コンポーネントにデータを渡せる

Slide 9

Slide 9 text

Vue.js表記の埋込エラー HTML上や、コンポーネントの属性にVue.jsのコンポーネントが埋め込まれるとエラーに なる {{ aaaa }} のようにして更にエスケープする、などが必要

Slide 10

Slide 10 text

本番用ビルド ● yarn prodでリリースビルド ● mix.version()でバージョニング ● commitしちゃう(css, js, mix-manifest.json) ● 本番で不具合があった時一瞬で戻せる(ビルド不要) ● 本番でNode動かす必要がない 個人開発だったらこれで十分かも

Slide 11

Slide 11 text

本番のインフラ

Slide 12

Slide 12 text

サーバー Google Compute Engine(f1-micro) DBもCloud SQLを使わず同じサーバーにインストールしているので無料運用。 ただしメモリ600MBくらいしかない…。

Slide 13

Slide 13 text

SQLはシンプルにする ● 基本的に SELECT * FROM table WHERE インデックスついてるカラム = value ORDER BY インデックスついてるカラム のような形 ● JOINしない→LaravelのEager loadingが勝手にいい感じにしてくれる ● Debugbarでクエリを見る ● サブクエリ、UNION、怪しい関数などはとにかく使わない。ORMやMySQL自体に 便利なものが色々あるからと言って適当に使うのは危険。 ● 複雑ならキャッシュする →はてなブックマークのテクノロジーでトップになっても問題なく動くくらい(ただ、意外と アクセスは多くないというのもある)

Slide 14

Slide 14 text

キャッシュの方法

Slide 15

Slide 15 text

ページをCDN配信する

Slide 16

Slide 16 text

Cloudflare 画像やhtmlなどの静的コンテンツを無料でCDN配信してくれる。(DNSサーバーを Cloudflareに変えるだけなので非常に簡単) コンテンツをCloudflare側にキャッシュし、閲覧者の近くのサーバーから配信してくれる のでめちゃくちゃ閲覧速度が速くなる。 → LaravelのページはPHPのためキャッシュが無効になっているが、設定を変えれば CDNで配信することもできる

Slide 17

Slide 17 text

記事ページだけ対応してみた 元々1秒位かかっていた(リージョンが遠い関係もある)

Slide 18

Slide 18 text

ページルールを設定 Cloudflare側にURLを設定すればそのURLをキャッシュしてくれる。 ただし、レスポンスヘッダをみてキャッシュすべきかどうかも判断しているため、これだけ だとまだキャッシュしてくれない。

Slide 19

Slide 19 text

CDN用のmiddlewareグループ ● NoCookieを追加 ● StartSession, ShareErrorsFromSession, VerifyCsrfTokenを削除

Slide 20

Slide 20 text

● RouteServiceProvider.php cdn.phpで設定できるように

Slide 21

Slide 21 text

ルーティングを書く

Slide 22

Slide 22 text

認証状態によって表示を変える ● セッション無効にしてるので不可能 ● セッション有効でも可能だが個人情報がキャッシュされてしまう ● ログイン状態はVuex StoreやlocalStorageにいれてVueコンポーネント側で処理 する ● 認証状態以外に必要なデータがあればAPIで取ってくる

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

PUSH通知 https://github.com/Paragraph1/php-fcm

Slide 25

Slide 25 text

やろうと思って諦めたこと

Slide 26

Slide 26 text

リアルタイム投稿 Scrapboxのように、入力中の内容を公開し、リアルタイムで他の閲覧者が見ることがで きる。 → WebSocketが必要

Slide 27

Slide 27 text

WebSocket Pusher.comと連携したりしてパフォーマンス的に不安な気がした。 → とりあえずFirebaseのRealtime databaseで対応した。   サーバー側に負荷もない。

Slide 28

Slide 28 text

現在のWebSocket https://github.com/beyondcode/laravel-websockets ・Pusherを経由しないで直接Laravel側と繋げるっぽいのでとても良さそう。

Slide 29

Slide 29 text

まとめ ● やっぱり何でも最初から揃っているというのは最高 ○ なにか必要になった時にハマることも少なくすぐ導入できる ○ 最近Expressでも作ったがパズルのようでしんどい