Page 1
ふつうのpixivのつくりかた
An introduction to building pixiv for ordinary PHPers
pixiv Inc.
USAMI Kenta
2023-07-26
PHP の今を語る!4社合同勉強会
公開日:
by USAMI Kenta @tadsan
にオンラインのZoom会議で開催された『【PHP Tech Talk】PHPの今を語る!4社合同勉強会』で15分枠として発表しました。
ふつうのpixivのつくりかた
An introduction to building pixiv for ordinary PHPers
pixiv Inc.
USAMI Kenta
2023-07-26
PHP の今を語る!4社合同勉強会
お前誰よ
PHPカンファレンス沖縄2023
LLイベント
の紹介
pixiv.netとは
ThePHPF
OSPO
ふつう
#とは
フレームワークが
使われていない
ただのPHP
※諸説あります
諸説ありますが 難しい構造には
なってない
メタプログラミングは
基本的に
あまりやらない
(こっそり使ってる 部分もありますが 大筋は追えるはず)
PHP詳しくない人でも 雰囲気に従って書けば セキュリティの問題は
起こさないように
pixivのPHP
よくある質問
10年前のコードのイメージ
<?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);
このクラスは
自動ロードされる
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
2023年こうなりたい
<?php // WwwRoutes.php
... ですっきり
public static function getRoutes() {
return [
'/' => Www_View_IndexController::main(...),
'/hoge' => Www_View_HogeController::main(...),
'/.well-known/change-password' => fn() =>
Util_Http::redirect_and_exit(
ReverseRoute::fullAccountsPasswordChange([])
),
],
コントローラをdispatchする処理
<?php
final class PCAppRunner {
public static function execute(Closure $action) {
try {
whoops
Controller_Util::turnOnWhoops();
Controller_Util::redirectToHttps();
$action();
パソコン版
} catch (\Throwable $exception) {
PCAppRunner::setHttpStatus(500);
Controller_Util::displayWhoops($exception);
開発しやすさの ための取り組み
CI
(Jenkins, GitLab CI)
PHPで開発しにくいところ
クエリパラメータの問題
$id = $_GET['user_id'];
if (is_numeric($id)) User_Common::getById($id);
不正な入力です
else error(" ");
ParamHelper
$id = ParamHelper::get('id')->asPositiveInt();
$user = User_Common::getById($id);
ParamHelper
$mode = ParamHelper::get('mode')->asStringInArray['hoge', 'fuga']);
テンプレートとURL生成の問題
<a href="{$smarty.const.SYSTEM_URL_WWW|escape}member_illust.php?id={$user.id|
escape}">{$user.name|escape}</a>
→ ReverseRoute
<a href="{reverse_route page='fullWwwMemberProfile' id=$user.id}">
{$user.name|escape}</a>
→ 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);
}
→ Attribute最高!!
#[RouteExample('https://www.pixiv.net/member.php?id=12345', ['id'=> 12345]) #[RouteExample('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の問題
PxvSql
PxvSql
PxvSql
TetoSQL
PDOのラッパー
新機能のリリース時にどうする?
機能の有効化/無効化
if ($_SERVER['REMOTE_ADDR'] === OFFICE_IP) {
hogehoge();
}
フィーチャートグル
if (ABTest_DevToggle::isEnabledDevToggle('hogeFunc')) {
hogehoge();
}
まとめ
何もない野原に秩序をつくる
まとめ
続きは で
Web
あと
( WEB+DB PRESS)
続きは で
Web
あと
( WEB+DB PRESS)
SQL PDO
続きは で
Web
あと
( WEB+DB PRESS)
PHP
読めるのでおすすめ
https://inside.pixiv.blog/tadsan/3991
Web