「ふつうのPHP」がpixivになるまで前史

公開日:

東京都新宿BLAZEで開催された『PIXIV TECH FES.』でショートセッション改め“BLAZE LT BATTLE”(5分)として発表しました。

Download PDF

スライドテキスト

Page 1

「ふつうのPHP」がpixivになるまで前史

pixiv.inc @tadsan

2020.02.17 PIXIV TECH FES.

Page 2

お前誰よ

  • 2012年11月にアルバイトとして入社
  • 2013年3月に正社員として入社、 API開発
  • 2013年10月からpixiv本体の開発に携わる
  • 2014年グロースチーム
  • 2015年フィーチャーフォン向け pixiv小説開発
  • 2016年メンテナンスチーム
  • 2019年から開発支援チーム

Page 3

何をしてきたのか

  • 公開APIおよびフレームワークのメンテ
  • 2013年 pixivのアカウント基盤統合
  • pixivの翻訳入稿フロー実装
  • pixiv年オートロード化、ドメイン統合設計
  • 2018年PHPStan CIの本番導入
  • 2019年ピクシブ百科事典メンテ引き継ぎ

Page 4

2012年入社

Page 5

PHPは入社してから (それ以前はRuby)

Page 6

今回のお題

Page 7

「ふつうのPHP」が pixivになるまで前史

Page 8

前史?

Page 9

Page 10

PHPカンファレンス関西2018

Page 11

Page 12

Page 13

このときは2012年
以後に改善したことを
主に話しました

Page 14

今回は私の入社時
(2012年以前)に既に
あったものについて
紹介していきます

Page 15

前提を揃えましょう

Page 16

ふつうのPHP?

Page 17

URLに.phpが
入っている

Page 18

http://www.pixiv.net
/member.php?id=105589

Page 19

http://www.pixiv.net
/member.php?id=105589

Page 20

https://www.pixiv.net
/users/105589

Page 21

URLとスクリプト ファイルが1:1で
対応する時代だった

Page 22

(当時の世間では) Webアプリ (cid:15496) CGI

(cid:15496) Perl or PHP

Page 23

pixivリリースの
2007年は
まだそういう時代

Page 24

参考までにRails2.0 が出て日本で注目さ れだしたのが2008年

Page 25

Ruby関係者に怒られないよ う言及するとRails以前にも tDiaryのようなRuby CGIな Webアプリもあったし現在 もRackでばっちり動きます

Page 26

重要なこと:
ファイル=URLのCGI的な 構造でFWに依存してない
(これは2015年まで続く)

Page 27

というわけで
話を本筋に戻して

Page 28

温故知新

Page 29

ふつうのPHP?

Page 30

LAMPスタック

Page 31

Linux, Apache, MySQL, P言語

Page 32

UTF-8
(リリース当時はUTF-8 じゃなかったらしいけど 2007年中には移行完了)

Page 33

Git
(2012年は普及時期だけど
会社としてSVNから完全
移行したのは割と早め)

Page 34

あとは制限時間で 打ち切られるまで
個別要素を語っていくぞ

Page 35

pixiv開発メンバーでも何 が一般的で何がpixiv独自 要素なのか把握できてる
ひとは多くないと思う

Page 36

PDO
(PHP Database Object)

Page 37

入社時には僅かなmysql関数も残ってたけど、ほぼPDO化が済んでた

(時代的にはPEAR::DBやMDB2でもおかしくない)

Page 38

SQLのクエリ末尾にスタッ クトレースを付加すること でスロークエリの発生箇所
を容易に特定できる

Page 39

それもPDOを生で使わず
にラッパークラスを設けて 使ってたのが本当にすごい

Page 40

基本は_call()をつかった
Proxyクラス
+べんりメソッドの追加

Page 41

系統とmaster/slaveごと にPDOのシングルトンを
管理するクラス

Page 42

slaveに対して書き込み
クエリが発行されることを
事前に防ぐ構造を提供

Page 43

Smarty
(HTMLテンプレートエンジン)

Page 44

SmartyはPHPの定番テ
ンプレートエンジンだが、 それ自体はXSS耐性がなく
全ての値を明示的にエス ケープしないといけない

Page 45

pixivではSmarty_
Compilerを拡張して
attributeで明示的にエス ケープしない出力を拒否

Page 46

SmartyはPHPスクリプトとして 変換されるものが実行され(コン パイルキャッシュ)、チェッカー が走るのはコンパイル時のみで
実行時コストは掛からない

Page 47

フレームワーク

Page 48

pixiv本体はフレームワー
クに依存していない

Page 49

が、部分的に薄いフレーム
ワークのような機能を持つ層
は複数あった

Page 50

独自フレームワーク
そのものも複数あった

Page 51

Page 52

(いわゆる)RESTful APIの pixiv内における初期事例
(PHPカンファレンス2013)

Page 53

身近に24ファイル程度の 読めるフレームワークが あったのはPHPの理解に
非常に大きく役立った

Page 54

タグジャンプできない
(=静的解析しにくい)制約は 反面教師として現在の改善に
活かされている

Page 55

総括

Page 56

今回は2012年以前の 前期pixivから現在も
現役の実装を紹介した

Page 57

前期pixivの内部実装について情報が外に出る機会は少なかった

Page 58

CGI時代の空気を色濃く残していたコードは2015年頃にフレームワーク的な構造に移植されている

Page 59

良いアーキテクチャとは言いがたいが、実装面としてユニークなものは多くある

Page 60

良い遺産だからと全肯定して残したいわけではない

Page 61

歴史から学んでもっと良いもので 置き換えていこう

Page 62

温故知新
ご静聴ありがとうございました