Page 1
「ふつうのPHP」が
pixivになるまで前史
pixiv.inc@tadsan
2020.02.17 PIXIV TECH FES.
公開日:
by USAMI Kenta@tadsan
に東京都の新宿BLAZEで開催された『PIXIV TECH FES.』でショートセッション改め“BLAZE LT BATTLE”(5分)として発表しました。
pixiv.inc@tadsan
2020.02.17 PIXIV TECH FES.
2012年入社
PHPは入社してから(それ以前はRuby)
今回のお題
「ふつうのPHP」がpixivになるまで前史
前史?
PHPカンファレンス関西2018
このときは2012年以後に改善したことを主に話しました
今回は私の入社時(2012年以前)に既にあったものについて紹介していきます
前提を揃えましょう
ふつうのPHP?
URLに.phpが入っている
http://www.pixiv.net/member.php?id=105589
http://www.pixiv.net/member.php?id=105589
https://www.pixiv.net/users/105589
URLとスクリプトファイルが1:1で対応する時代だった
(当時の世間では)Webアプリ ≒ CGI≒ Perl or PHP
pixivリリースの2007年はまだそういう時代
参考までにRails2.0が出て日本で注目されだしたのが2008年
Ruby関係者に怒られないよう言及するとRails以前にもtDiaryのようなRuby CGIなWebアプリもあったし現在もRackでばっちり動きます
重要なこと:ファイル=URLのCGI的な構造でFWに依存してない(これは2015年まで続く)
というわけで話を本筋に戻して
温故知新
ふつうのPHP?
LAMPスタック
Linux, Apache,MySQL, P言語
(リリース当時はUTF-8じゃなかったらしいけど2007年中には移行完了)
(2012年は普及時期だけど会社としてSVNから完全移行したのは割と早め)
あとは制限時間で打ち切られるまで個別要素を語っていくぞ
pixiv開発メンバーでも何が一般的で何がpixiv独自要素なのか把握できてるひとは多くないと思う
(PHP Database Object)
入社時には僅かなmysql関数も残ってたけど、ほぼPDO化が済んでた(時代的にはPEAR::DBやMDB2でもおかしくない)
SQLのクエリ末尾にスタックトレースを付加することでスロークエリの発生箇所を容易に特定できる
それもPDOを生で使わずにラッパークラスを設けて使ってたのが本当にすごい
基本は_call()をつかった
Proxyクラス+べんりメソッドの追加
系統とmaster/slaveごとにPDOのシングルトンを管理するクラス
slaveに対して書き込みクエリが発行されることを事前に防ぐ構造を提供
(HTMLテンプレートエンジン)
SmartyはPHPの定番テンプレートエンジンだが、それ自体はXSS耐性がなく全ての値を明示的にエスケープしないといけない
pixivではSmarty_Compilerを拡張してattributeで明示的にエスケープしない出力を拒否
SmartyはPHPスクリプトとして変換されるものが実行され(コンパイルキャッシュ)、チェッカーが走るのはコンパイル時のみで実行時コストは掛からない
フレームワーク
pixiv本体はフレームワークに依存していない
が、部分的に薄いフレームワークのような機能を持つ層は複数あった
独自フレームワークそのものも複数あった
(いわゆる)RESTful APIのpixiv内における初期事例(PHPカンファレンス2013)
身近に24ファイル程度の読めるフレームワークがあったのはPHPの理解に非常に大きく役立った
タグジャンプできない(=静的解析しにくい)制約は反面教師として現在の改善に活かされている
総括
今回は2012年以前の前期pixivから現在も現役の実装を紹介した
前期pixivの内部実装について情報が外に出る機会は少なかった
CGI時代の空気を色濃く残していたコードは2015年頃にフレームワーク的な構造に移植されている
良いアーキテクチャとは言いがたいが、実装面としてユニークなものは多くある
良い遺産だからと全肯定して残したいわけではない
歴史から学んでもっと良いもので置き換えていこう
ご静聴ありがとうございました
関連リンクがありません。
