狠狠撸
Submit Search
Real World PHP in pixiv
?
2 likes
?
8,639 views
Kenta USAMI
Follow
2015年10月23日にピクシブ株式会社で行った、ぐるなびさんとの合同勉强会で発表
Read less
Read more
1 of 31
Download now
More Related Content
Real World PHP in pixiv
1.
Real World PHP
in pixiv ぐるなびピクシブ 合同勉強会? 2015年10月23日
2.
お前誰よ ? うさみけんた /
tadsan ? 2012年11月にピクシブ入社 ? 入社前は自宅警備しながらRuby書いてた ? API/OAuth/PC版サービスなどのPHPもろもろ ? 最近では漫画?小説チームとして動いてる ? PHPカンファレンスのLT応募に落ちました
3.
注意 ? 時間配分は考慮してない ? 開発楽しい!とかじゃなく淡々と羅列するだけ ?
ゆっくり話すので、「お前何言ってんんだ」と 感じたらつっこみを入れてください ? 資料はあとで公開します
4.
アジェンダ ? 現状についてだらだら話す ? pixivのデプロイについて ?
pixivの開発環境について ? pixivのPHPについて ? pixivのSQLについて ? そのほか
6.
pixiv.git (クラスのお友達) ├ accounts.pixiv.net ├
admin.pixiv.net ├ api.pixiv.net ├ batch ├ embed.pixiv.net ├ m.pixiv.net ├ me.pixiv.net ├ oauth.pixiv.net ├ pixiv-lib ├ public-api.pixiv.net ├ rpc.pixiv.private ├ source.pixiv.net ├ spapi.pixiv.net ├ spotlight.pics ├ ssl.pixiv.net ├ touch.pixiv.net ├ util ├ vendor ├ web-test └ www.pixiv.net
7.
変遷 ? 以前(2013年頃まで)は、サブディレクトリ ごとに独立したGitリポジトリで、共通部分 をsubmoduleとして扱ってた ? 共通部分の抽象化もうまくなされて居らず、? 重複?細部が異なるコードが分散してた
8.
変遷 ? submoduleは疎結合なモジュールに適する ? 結合度が高いモジュールのリポジトリを分 割すると、変更コストが極めて高い ?
リポジトリを統合することで凝集度を高め るリファクタリングも断行しやすくなった ? 細部が異なる重複コード問題も根絶
9.
デプロイ ? 基本的にサーバー全台(xx台程度)にrsync ? 以前(2013年)はPHPファイルの増減を伴った デプロイ時には(ページにもよるが)、? xxx件程度のエラーが発生してしまってた ?
現在はBlue-GreenDeploymentの確立で、 ファイルの追加/削除も怖いものではない
11.
デプロイ (pploy) ? 汎用的なデプロイシステム ?
/.deploy ディレクトリにファイルを配置 ? bin/deploy スクリプトが実行される ? readme.html で画面カスタマイズ可能 ? Gitに依存するので、特定のバージョンを チェックアウトして反映することも容易
12.
デプロイと変遷 (ブログ記事紹介) ? 開発?デプロイ環境の変遷
2014年春版 ? 履歴を残したまま複数のgitリポジトリを統 合する ? pixivのデプロイを支えるpploy ? github: edvakf/pploy ? WEB+DB PRESS Vol. 84
13.
pixivの開発環境 ? DBなどの依存が多く、ローカルに環境を構 築することは容易ではない(不可能でもない) ? 共有の環境にSSHでログインして開発 ?
端末のEmacsやVimで開発するひとも ? rsyncでローカルと同期してPhpStormなど ? @tadsanはTRAMPを利用してる
14.
pixivの開発環境 ? ApacheのVirtualHostを大胆に活用 ? /home/www/にシンボリックリンクを作成 ?
社内ネットワークでDNS名前解決できる ? www.tadsan.example.com のような形式 ? pixiv関係なくても任意のPHPを動作可能 ? OpenStackで同じ仕様のサーバー増やせる
15.
pixiv-lib ? DBの操作を抽象化する層(DAO) ? データの入出力などをまとめて扱う層 ?
社内では「Common層」と呼ばれる ? セッション?国際化などの基盤機能 ? その他の共通処理いろいろ! ? むかしはextlibって呼ばれてた (懐古)
16.
pixivのPHPコード ? PHP 5.5
+ Apache ? URLを見ればわかる通り、ページ=PHP ? search.php, member_illust.php など… ? 一部のリクエストはHHVMで捌いてる ? ルーティングのためmod_rewriteに依存
17.
pixivのPHPコード ? 既存のフレームワークに依存しない ? 独自フレームワークを運用してる部分もある ?
口にすると顔をしかめられがちだが、? 用途に合せて設計ができるのは悪くない ? どちらにしろ自分たちでセキュリティを? 担保しなければいけないのはおんなじ!
18.
pixivのPHPコード ? 動的な言語機能は必要ない限り利用しない ? クラスの静的メソッドを多用する ?
継承は排除する方向 ? トレイトもあまり利用しない ? リファレンスは原則排除する ? PhpStormを使ってもつらいものはつらい
19.
pixivのPHPコード ? include_onceってたくさん書いてる!! ? オートローダーの利用は限定的 ?
pixiv-libでは現状は利用不可 (鋭意改善中) ? リポジトリ内に混在する都合上、? Composerのautoloadは利用しにくい ? 一部ではphpabで生成してinclude
20.
pixivのPHPコード ? コミットログやコード内コメントは、? 英語または日本語で各人の得意な方で ? 意識高く「全部英語で」など拘らない ?
必要な文章は論理的に誤りがないように ? コミットのルールは厳格に定めない ? 各人のやりかたを尊重する ? 典型的な Github Flow で運用
21.
loadset.php ? 各プロジェクトの初期化ファイル ? エラーハンドラーの設定 ?
必要なライブラリのロード ? 定数(de?ne)の定義 ? loadsetのみrequire_onceで読み込む ? そのほかは全部 include_once で
22.
pixivのSQL ? MySQL 5.5 ?
文字列結合によるSQL組立つらすぎ… ? ORマッパー/自動クエリビルダーは利用せず ? 2015年の初旬からSQLに型をつけて安全に 書けるライブラリを社内で運用 ? 脆弱性対策の文脈で生まれたが書きやすい
24.
pixivのSQL ? Q: なぜ自動クエリビルダー利用しないの? ?
いままでが文字列結合で組み立ててたから ? クエリが単純ではないパターンも多い ? 例: ブックマークなど
25.
pixivのAPI ? いろんな試行錯誤をしてきた ? 一部で有名なCSVのAPI
(最初期) ? ActiveResourceで利用するためのAPI ? スマートフォンアプリ向けREST API ? 社内向けのシンプルなAPI (RPC)
26.
パッケージ管理 ? Composerを利用 ? composer.pharはpixiv.gitに同梱 ?
社内ネットワーク内でSatisを運用 ? Jenkinsで定期的に更新 ? GitHubの障害があっても支障なし ? 手動で実行もできる
27.
pixivのテスト ? 基本的にPHPUnitでテストを書く ? 2013年頃にテストを書く文化が定着した ?
GitlabのMRにpushしたら自動テスト走る ? うっかりmasterにpushされたら即座に? idobataに通知される
28.
pixivのレビュー体制 ? 毎週pixiv.gitに携る各チームのレビュアーで? 設計方針や最新の情報などを共有?相談 ? レビュアーが各チームに持ち帰る ?
各自メンバーに説明したり、レビュー過程 で指摘することで全体のコード品質を保つ ? ガイドラインや推奨スタイルの確立
29.
そのほか ? pixivのデプロイ回数は一日およそ20回 ? ディレクターが文言変更をすることが多い ?
Jenkinsをいっぱい使ってる ? cronの代替として ? スクリプトのWebUIとしても利用できる ? 各種エディタの勢力は均衡してる
30.
ふろく (WEB+DB PHP連載) ?
特におもしろい記事 ? Vol.81: テストしにくいコード対策 ? Vol.83: 安全なコーディングスタイル ? Vol.84: デプロイ?Composer運用 ? Vol.87: PHPDoc記法で型注釈 ? Vol.88: HHVMの運用
31.
続きはWebで ? https://github.com/pixiv ? http://inside.pixiv.net/ ?
GitHub (tadsan個人で公開してるもの) ? BaguettePHP/php-simple-routing ? BaguettePHP/http-accept-language
Download