Page 1
「ふつうの 」が
PHP
になるまで
pixiv.inc
USAMI Kenta @tadsan
2018-07-14 PHPカンファレンス関西 #php
公開日:
by USAMI Kenta @tadsan
「ふつうの 」が
PHP
になるまで
pixiv.inc
USAMI Kenta @tadsan
2018-07-14 PHPカンファレンス関西 #php
お前誰よ
(@tadsan) / Zonu.EXE
pixiv
の紹介
イラストコミュニケーションサービス
pixiv
: 7000 (ID 1 4000 )
: 3000 (ID )
: 35
: 76 (HTTPd PV )
: 53 (pixiv Apache HTTPd )
用語
( PC )
( touch.pixiv.net)
pixiv.git
git submodule
accounts.pixiv.net pixiv-lib
! !
admin public-api.pixiv.net
! !
app-api.pixiv.net rpc.pixiv.private
! !
batch sensei.pixiv.net
! !
bin source.pixiv.net
! !
bungei-api.pixiv.net spotlight.pics
! !
comic-api.pixiv.net ssl.pixiv.net
! !
embed.pixiv.net tests
! !
fanbox.pixiv.net touch.pixiv.net
! !
m.pixiv.net util
! !
me.pixiv.net www.pixiv.net
! !
oauth.pixiv.net www.pixivision.net
" "
https://niconare.nicovideo.jp/watch/kn1259
よくある質問
…
…
の歴史
お断り
数々の変更は が直接行っ
@tadsan
たものではなく、歴代の開発者が 改善を積み重ねてきたものです
むしろ恩恵を受けてきた立場
( )
2
2 2
2 2 2
2
2 2
2
0
2
0 0
0
0 0
0
0 0
0
0
0
1 1
0 1 1
1
1 1
1
7
1
1 2
8 6 7
0
年
3 4
年 年
年 年 年
年
8
年 年
5
年
年
国
p p p P p p p p ppp
ピ 国 う ス
p p p
P
r
i i i i i i i iii
u
i i i
x x x x x x x xxx
際
x x x
ク 際 ご マ
i
b
v
i i i i i i i iii
i i i
v v v v v v v vvv
v v v
l
a
シ 版 イ ┃
版
i
(
ス
モ
t
公
ア
小
c
モ
小
ア
リ
F F
P
W
e
ブ ラ ト
p
p
A A
A
H
マ
バ
開
プ
説
バ
説
プ
ニ
i
i
E
A
N N
百 機 フ
x
P
x
P
B
P
┃
イ
リ
モ
i
イ
B B
i
モ
リ
I
ュ
5
)
v
v
科 能 ォ
I
O O
.
開
ト
ル
(
(
・
バ
5
ル リ
バ
刷
┃
開
β
β
X X
事 リ ン
発
化
)
)
フ
A
イ
ニ 公 イ
新
ア
リ
発
典 リ 版
公
終
公
終
ォ
P
ル
ュ 開 ル
・
ル
ニ
┃ ド
開
了
開
了
ン
I
┃
専
ュ
・
公
(
ス メ
終
公
t
まだ
版
ア
用
┃
S
開 o
イ
公
了
Web制作会社
開
u
ル
A
Pア
ン
c
入社ここ
@tadsan
公
開
h
・
P
社名
Aル
統
.
開
年 月
(2012 11 )
p
変更
中
I
化
合
i x
断
開
サービスの公開 で見る年表
進
終了
i
( )
v
発
行
. n
pixiv以外のサー
e
ビスも増えてく
t )
from
React
REST API
Anti REST
Redmine
2 2 2
2
2
2
2
0 0 0
0
0
0
0
1 1 1
1
1
1
1
2 6 7
3
年 年 年
4
8
5
年
年
年
年
リ
ア
共 正
T C
p
p p p
デ ス
P p G
国
P J p
P
リ
h
e
o
i
i i i
H
r
i
i
バ
u
i
プ
通 規
x
x x x
プ マ
x
x
際
t
n
i
r
ポ
m
b
P
v
i
i i i
L
i
i
i
k
┃
リ
v
表
v v v
ク
f
v
v
l
ロ ┃
U
a
p
版
a
ジ
t
i
i
(
小
t
b
n
o
c
リ
F
n
ス
P
P
専
W
現
ラ
e イ ト
導
p
ト
A
s
s
i
導
H
H
A
説
t
ニ
E
ル
e
i
で
用
A
ベ
ス
N
刷 フ
P
導
P
x
P 入
リ
B
入 r
モ
P
B
i
ュ
5
┃
7
I
全
の A
自 ┃
)
新 ォ
v
入
I
統
O
.
.
開
バ
(
5
1
┃
テ リ
面
C P
開 動 ス
X
β
ン
合
Symfony
発 化 化
)
イ
ア
ィ ニ
リ
導
I I
の
発 ロ
版
Lime
公
ル
ル
ュ
ン
ニ
入
導 開
L
┃
ド
開
┃
グ ュ
・
入
発
社内
i
ド
(
メ
独立リポ
公
t
導 ア
フレームワーク
┃
S
o
n
イ
最高便利
ジトリを合体
開
u
(PHPCon2013)
入 ル
P ア
t
ン
c h
ActiveResource
A ル
導
アトミック
規則的
統
PEAR依存廃止
. p
(Rails)
化
入
URL生成
合
i x
進
@tadsan
使用技術の変遷で見る年表
i v
行
が血走って
.
n
ただし 入社前後に限る
フレームワーク作る
e
tadsan
include
t )
地獄
お断り
今回の発表で言及されないもの は概ね時間の制約で取捨選択さ れたか忘れてるだけなので、懇 親会や で にきいて
Twitter @tadsan
ふつうの
PHP #
とは
の
pixiv PHP
nginx Apache
DocumentRoot .php URL
年のコードのイメージ
2012
<?php // www.pixiv.net/htdocs/hoge.php
require_once __DIR__ . '/../inc/bootstrap.php';
include_onceいっぱい
include_once INC_PATH . '/Hoge/Fuga.php';
include_once INC_PATH . '/Hoge/Piyo.class.php';
try {
display()
エラーハンドリング
} catch (Exception $e) {
(してないページもあった)
error::exception_error($e);
}
この下にもいっぱい
function display() {
ファイルローカルな
// ...
グローバル関数
年のコードのイメージ
2015
<?php // www.pixiv.net/htdocs/hoge.php
require_once __DIR__ . '/../inc/bootstrap.php';
include_once一個だけ
AppRunner::execute(new Www_HogeController);
このクラスは
自動ロードされる
名前の由来は知らない
AppRunner ( )
<?php
final class PCAppRunner {
public static function execute(Controller $controller) {
try {
whoops
Controller_Util::turnOnWhoops();
Controller_Util::redirectToHttps();
パソコン版
$controller->main();
} catch (\Throwable $exception) {
PCAppRunner::setHttpStatus(500);
Controller_Util::displayWhoops($exception);
とエラーハンドリング
AppRunner
AppRunner
whoops!
例外/エラー処理を完結させることも可能ではあるが、割と複雑になるの
で、開発環境でエラー画面を表示するだけの目的に専念してる
PHP file_put_contents()
に書き込んでる
年のコードのイメージ
2018
final class Controller_WwwRoutes {
htdocs/hoge.phpは消滅
public static function getRoutes() {
$route_map = [
'/' => [
'action' => function () {
URLとファイルは切り離され
Www_IndexController::main();
マップの一要素に
},
],
'/hoge.php' => [
'action' => function () {
全URLが1ファイルに
Www_HogeController::main();
},
カンファレンス で発表
PHP 2017
命名規則
PSR-0 _
PSR
static
LT
去年の当日募集 で話した
LT
開発しやすさの
ための取り組み
で開発しにくいところ
PHP
URL
(rails console)
クエリパラメータの問題
$id = $_GET['user_id'];
if (is_numeric($id)) User_Common::getById($id);
不正な入力です
else error(" ");
→
ParamHelper
$id = ParamHelper::getPositiveInt('id');
User_Common::getById($id);
( form)
AppRunner
→
ParamHelper
$mode = ParamHelper::getEnum('mode', ['hoge', 'fuga'], ['post' => 'only']);
?mode=piyo
テンプレートと 生成の問題
URL
<a href="{$smarty.const.SYSTEM_URL_WWW|escape}member_illust.php?id={$user.id|
escape}">{$user.name|escape}</a>
typo
→
ReverseRoute
<a href="{reverse_route page='fullWwwMemberProfile' id=$user.id}">
{$user.name|escape}</a>
reverse_route page
や ヘルパーなどの名前でサポートしてる
ReverseRouting URL
→
ReverseRoute
/**
* @route\example https://www.pixiv.net/member.php?id=12345 {id: 12345}
* @route\example https://www.pixiv.net/member.php?id=12345&utm_source=xxxxx
{id: 12345, utm_source: "xxxxx"}
*/
public static function fullWwwMemberProfile(array $params)
{
Util_Assert::num($params['id']);
return ReverseRoute::buildUrl(SYSTEM_URL_WWW, '/member.php', ['id'],
$params);
}
に書きました
blog
https://devpixiv.hatenablog.com/entry/2016/10/25/093000
の問題
PDO
SQL …
でも で複雑なクエリを書こうとすると文字列結合が避けられない
PDO …
? bindValue
PxvSql
PxvSql
null
Qiita https://qiita.com/tadsan/items/e615a779baa6eabdab47
のラッパー
PDO
2011
(master) (slave)
SQL
新機能をリリース時にどうする?
A
予期せぬ問題を引き起こすことがある
B
鮮度のよいうちにマージしておきたいリリース時の変更を最小限に
( )
テスト/機能の有効化/無効化
A/B
if ($_SERVER['REMOTE_ADDR'] === OFFICE_IP) {
hogehoge();
}
テストフレームワーク
DevToggle (A/B )
if (ABTest_DevToggle::isEnabledDevToggle('hogeFunc')) {
hogehoge();
}
if
A/B ( )
まとめ
何もない野原に秩序をつくる
Laravel
2018
が 年からユーザーに価値を提供してきた結果は変らない
pixiv 2007
続きは で
Web
あと
( WEB+DB PRESS)
https://niconare.nicovideo.jp/users/5962
続きは で
Web
あと
( WEB+DB PRESS)
SQL PDO
続きは で
Web
あと
( WEB+DB PRESS)
PHP
読めるのでおすすめ
https://inside.pixiv.blog/tadsan/3991
Web