Real World PHP in pixiv

公開日:

Download PDF

スライドテキスト

Page 1

Real World PHP in pixiv

ぐるなびピクシブ合同勉強会

年 月 日

2015 10 23

Page 2

お前誰よ

うさみけんた

/ tadsan

  • 年 月にピクシブ入社
    2012 11
  • 入社前は自宅警備しながら 書いてた

Ruby

  • 版サービスなどの もろもろ
    API/OAuth/PC PHP
  • 最近では漫画・小説チームとして動いてる
  • カンファレンスの 応募に落ちました
    PHP LT

Page 3

注意

時間配分は考慮してない

  • 開発楽しい!とかじゃなく淡々と羅列するだけ
  • ゆっくり話すので、「お前何言ってんんだ」と
  • 感じたらつっこみを入れてください

資料はあとで公開します

Page 4

アジェンダ

現状についてだらだら話す

  • のデプロイについて
    pixiv
    • の開発環境について
      pixiv
    • の について
      pixiv PHP
    • の について
      pixiv SQL
    • そのほか

Page 5

Page 6

pixiv.git (クラスのお友達)
├ accounts.pixiv.net ├ rpc.pixiv.private ├ admin.pixiv.net ├ source.pixiv.net ├ api.pixiv.net ├ spapi.pixiv.net ├ batch ├ spotlight.pics ├ embed.pixiv.net ├ ssl.pixiv.net ├ m.pixiv.net ├ touch.pixiv.net
├ me.pixiv.net ├ util ├ oauth.pixiv.net ├ vendor ├ pixiv-lib ├ web-test
├ public-api.pixiv.net └ www.pixiv.net

Page 7

変遷

以前 年頃までは、サブディレクトリ

(2013 )

  • ごとに独立した リポジトリで、共通部分

Git
を として扱ってた

submodule
共通部分の抽象化もうまくなされて居らず、

  • 重複・細部が異なるコードが分散してた

Page 8

変遷

は疎結合なモジュールに適する

submodule

  • 結合度が高いモジュールのリポジトリを分
  • 割すると、変更コストが極めて高い

リポジトリを統合することで凝集度を高め

  • るリファクタリングも断行しやすくなった

細部が異なる重複コード問題も根絶

Page 9

デプロイ

基本的にサーバー全台 台程度に

(xx ) rsync

  • 以前 年は ファイルの増減を伴った
    (2013 ) PHP
  • デプロイ時にはページにもよるが、

( )

件程度のエラーが発生してしまってた

xxx 現在は の確立で、

Blue-GreenDeployment

  • ファイルの追加削除も怖いものではない

/

Page 10

Page 11

デプロイ

(pploy)
汎用的なデプロイシステム

  • ディレクトリにファイルを配置
    /.deploy
  • スクリプトが実行される
    bin/deploy
    • で画面カスタマイズ可能
      readme.html
    • に依存するので、特定のバージョンを
      Git
  • チェックアウトして反映することも容易

Page 12

デプロイと変遷

ブログ記事紹介

( )

開発・デプロイ環境の変遷 年春版

2014

  • 履歴を残したまま複数の リポジトリを統

git

  • 合する

のデプロイを支える

pixiv pploy

  • github: edvakf/pploy
  • WEB+DB PRESS Vol. 84

Page 13

の開発環境

pixiv

などの依存が多く、ローカルに環境を構

DB

  • 築することは容易ではない

不可能でもない

( )

共有の環境に でログインして開発

SSH

  • 端末の や で開発するひとも

Emacs Vim

  • でローカルと同期して など
    rsync PhpStorm
  • は を利用してる
    @tadsan TRAMP

Page 14

の開発環境

pixiv

の を大胆に活用

Apache VirtualHost

  • にシンボリックリンクを作成
    /home/www/
  • 社内ネットワークで 名前解決できる

DNS

  • のような形式
    www.tadsan.example.com
  • 関係なくても任意の を動作可能
    pixiv PHP
  • で同じ仕様のサーバー増やせる
    OpenStack

Page 15

pixiv-lib

の操作を抽象化する層

DB (DAO)

  • データの入出力などをまとめて扱う層
  • 社内では「 層」と呼ばれる

Common

  • セッション・国際化などの基盤機能
  • その他の共通処理いろいろ!
  • むかしは って呼ばれてた

懐古

extlib

  • ( )

Page 16

の コード

pixiv PHP

PHP 5.5 + Apache

  • を見ればわかる通り、ページ
    URL =PHP
    • など
      search.php, member_illust.php …
    • 一部のリクエストは で捌いてる

HHVM

  • ルーティングのため に依存

mod_rewrite

Page 17

の コード

pixiv PHP
既存のフレームワークに依存しない

  • 独自フレームワークを運用してる部分もある
  • 口にすると顔をしかめられがちだが、
  • 用途に合せて設計ができるのは悪くない

どちらにしろ自分たちでセキュリティを

  • 担保しなければいけないのはおんなじ!

Page 18

の コード

pixiv PHP
動的な言語機能は必要ない限り利用しない

  • クラスの静的メソッドを多用する
  • 継承は排除する方向
  • トレイトもあまり利用しない
  • リファレンスは原則排除する
  • を使ってもつらいものはつらい
    PhpStorm

Page 19

の コード

pixiv PHP

ってたくさん書いてる!!

include_once

  • オートローダーの利用は限定的
  • では現状は利用不可

鋭意改善中

pixiv-lib

  • ( )
    リポジトリ内に混在する都合上、
  • の は利用しにくい
    Composer autoload
    一部では で生成して

phpab include

Page 20

の コード

pixiv PHP

コミットログやコード内コメントは、

  • 英語または日本語で各人の得意な方で

意識高く「全部英語で」など拘らない

  • 必要な文章は論理的に誤りがないように
  • コミットのルールは厳格に定めない
  • 各人のやりかたを尊重する
  • 典型的な で運用

Github Flow

Page 21

loadset.php
各プロジェクトの初期化ファイル

  • エラーハンドラーの設定
  • 必要なライブラリのロード
  • 定数 の定義
    (define)
  • のみ で読み込む
    loadset require_once
  • そのほかは全部 で

include_once

Page 22

pixiv SQL

MySQL 5.5

  • 文字列結合による 組立つらすぎ

SQL …

  • マッパー自動クエリビルダーは利用せず
    OR /
  • 年の初旬から に型をつけて安全に
    2015 SQL
  • 書けるライブラリを社内で運用

脆弱性対策の文脈で生まれたが書きやすい

Page 23

Page 24

pixiv SQL

なぜ自動クエリビルダー利用しないの?

Q:

  • いままでが文字列結合で組み立ててたから
  • クエリが単純ではないパターンも多い
  • 例 ブックマークなど
    :

Page 25

pixiv API
いろんな試行錯誤をしてきた

  • 一部で有名な の 最初期

CSV API ( )

  • で利用するための
    ActiveResource API
  • スマートフォンアプリ向け

REST API

  • 社内向けのシンプルな

API (RPC)

Page 26

パッケージ管理

を利用

Composer

  • は に同梱
    composer.phar pixiv.git
    • 社内ネットワーク内で を運用

Satis

  • で定期的に更新
    Jenkins
    • の障害があっても支障なし
      GitHub
    • 手動で実行もできる

Page 27

のテスト

pixiv

基本的に でテストを書く

PHPUnit

  • 年頃にテストを書く文化が定着した
    2013
  • の に したら自動テスト走る
    Gitlab MR push
  • うっかり に されたら即座に

master push

  • に通知される
    idobata

Page 28

のレビュー体制

pixiv

毎週 に携る各チームのレビュアーで

pixiv.git

  • 設計方針や最新の情報などを共有・相談

レビュアーが各チームに持ち帰る

  • 各自メンバーに説明したり、レビュー過程
    • で指摘することで全体のコード品質を保つ

ガイドラインや推奨スタイルの確立

Page 29

そのほか

のデプロイ回数は一日およそ 回

pixiv 20

  • ディレクターが文言変更をすることが多い
  • をいっぱい使ってる
    Jenkins
  • の代替として
    cron
    • スクリプトの としても利用できる

WebUI

  • 各種エディタの勢力は均衡してる

Page 30

ふろく 連載

(WEB+DB PHP )

特におもしろい記事

  • テストしにくいコード対策
    Vol.81:
    • 安全なコーディングスタイル
      Vol.83:
    • デプロイ・ 運用
      Vol.84: Composer
    • 記法で型注釈
      Vol.87: PHPDoc
    • の運用
      Vol.88: HHVM

Page 31

続きは で

Web

https://github.com/pixiv

  • http://inside.pixiv.net/
  • 個人で公開してるもの
    GitHub
  • (tadsan )
    BaguettePHP/php-simple-routing
    • BaguettePHP/http-accept-language