Page 1
「ふつうのPHP」が
になるまで
pixiv.inc
USAMI Kenta @tadsan
2018-07-14 PHPカンファレンス関西 #php
公開日:
by USAMI Kenta@tadsan
に大阪府大阪市北区のグランフロント大阪 北館 タワーC 8階で開催された『PHPカンファレンス関西2018』でレギュラートーク(30分)として発表しました。
2018-07-14 PHPカンファレンス関西 #php
! accounts.pixiv.net! admin! app-api.pixiv.net! batch! bin! bungei-api.pixiv.net! comic-api.pixiv.net! embed.pixiv.net! fanbox.pixiv.net! m.pixiv.net! me.pixiv.net" oauth.pixiv.net! pixiv-lib! public-api.pixiv.net! rpc.pixiv.private! sensei.pixiv.net! source.pixiv.net! spotlight.pics! ssl.pixiv.net! tests! touch.pixiv.net! util! www.pixiv.net" www.pixivision.net
数々の変更は@tadsanが直接行ったものではなく、歴代の開発者が改善を積み重ねてきたものです(むしろ恩恵を受けてきた立場)
2007年
2011年
2012年
2008年
2016年
2017年
2010年
2013年
2014年
2018年
2015年
pixiv
pixiv
pixiv
pixiv
pixiv
pixiv
pixiv
pixiv
pixiv
国際版
国際版
公開
Public API
pixiv(WEB)
Private API
pixiv PHP5.5
pixiv FANBOX
pixiv FANBOX
pixiv(β)
pixiv(β)
開発
化
開発
公開
公開
終了
モバイル公開
モバイル終了
うごイラ機能リリ┃ス
ピクシブ百科事典公開
まだWeb制作会社
小説モバイル終了
小説モバイル公開
@tadsan 入社ここ
アプリ
PI公開
リニュ┃アル
(2012年11月)
スマ┃トフォン版公開
社名変更
スマ┃トフォン版ドメイン統合
リニュ┃アル
断
アプリ刷新
用API開発
リニュ┃アル
PA化進行
pixiv以外のサービスも増えてく
(touch.pixiv.net)
React
REST API
Anti REST
from Redmine
2012年
2016年
2017年
2013年
2014年
2018年
2015年
pixiv
pixiv
Thrift
国際版
GitLab
Jenkins
PHPUnit
Composer
Public API
導入
pixiv(WEB)
導入で
Private API
デプロイ刷新
導入
pixiv PHP5.5
pixiv PHP7.1
pixiv FANBOX
Symfony
pixiv(β)
リポジトリ統合
開発
化
化
Lime
開発
全面導入
公開
のCI導入
アプリ専用API開発
共通クラス自動ロ┃ド
最高便利
独立リポジトリを合体
小説モバイル公開
社内フレームワーク(PHPCon2013)
リバ┃スル┃ティング導入
リニュ┃アル
ActiveResource
アトミック
PEAR依存廃止
リニュ┃アル
(Rails)
規則的URL生成
正規表現ベ┃スのLint導入
スマ┃トフォン版ドメイン統合
リニュ┃アル
PA化進行
@tadsanが血走ってフレームワーク作る
ただしtadsan入社前後に限る
include
(touch.pixiv.net)
地獄
今回の発表で言及されないものは概ね時間の制約で取捨選択されたか忘れてるだけなので、懇親会やTwitterで@tadsanにきいて
include_onceいっぱい
エラーハンドリング(してないページもあった)
<?php // www.pixiv.net/htdocs/hoge.php require_once __DIR__ . '/../inc/bootstrap.php';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() {// ...
グローバル関数
<?php // www.pixiv.net/htdocs/hoge.php require_once __DIR__ . '/../inc/bootstrap.php';
include_once一個だけ
AppRunner::execute(new Www_HogeController);
このクラスは自動ロードされる
<?php
whoops
final class PCAppRunner {public static function execute(Controller $controller) {try {Controller_Util::turnOnWhoops();Controller_Util::redirectToHttps();
パソコン版
$controller->main();} catch (\Throwable $exception) {PCAppRunner::setHttpStatus(500);Controller_Util::displayWhoops($exception);
例外/エラー処理を完結させることも可能ではあるが、割と複雑になるので、開発環境でエラー画面を表示するだけの目的に専念してる
に書き込んでる
htdocs/hoge.phpは消滅
URLとファイルは切り離され
マップの一要素に
全URLが1ファイルに
final class Controller_WwwRoutes {public static function getRoutes() {$route_map = ['/' => ['action' => function () {Www_IndexController::main();},],'/hoge.php' => ['action' => function () {Www_HogeController::main();},
開発しやすさのための取り組み
$id = $_GET['user_id'];if (is_numeric($id)) User_Common::getById($id);else error("不正な入力です");
$id = ParamHelper::getPositiveInt('id');User_Common::getById($id);
$mode = ParamHelper::getEnum('mode', ['hoge', 'fuga'], ['post' => 'only']);
<a href="{$smarty.const.SYSTEM_URL_WWW|escape}member_illust.php?id={$user.id|escape}">{$user.name|escape}</a>
<a href="{reverse_route page='fullWwwMemberProfile' id=$user.id}">{$user.name|escape}</a>
ReverseRoutingやURLヘルパーなどの名前でサポートしてる
/*** @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);}
でもPDOで複雑なクエリを書こうとすると文字列結合が避けられない…
予期せぬ問題を引き起こすことがある
鮮度のよいうちにマージしておきたい (リリース時の変更を最小限に)
if ($_SERVER['REMOTE_ADDR'] === OFFICE_IP) {hogehoge();}
if (ABTest_DevToggle::isEnabledDevToggle('hogeFunc')) {hogehoge();}
pixivが2007年からユーザーに価値を提供してきた結果は変らない
読めるのでおすすめ
