Skip to content

「ふつうの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の翻訳入稿フロー実装
  • 2015年オートロード化、ドメイン統合設計
  • 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アプリ ≒ CGI≒ 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

温故知新

ご静聴ありがとうございました