Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PHPカンファレンス振り返りと プロポーザルについて話します / PHP Tech Talk ...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Hiroya-W / yuyukun
August 27, 2026
Technology
12
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PHPカンファレンス振り返りと プロポーザルについて話します / PHP Tech Talk Night ~ after phpcon 2026
PHP Tech Talk Night ~ after phpcon 2026, 2026/08/27
Hiroya-W / yuyukun
August 27, 2026
More Decks by Hiroya-W / yuyukun
See All by Hiroya-W / yuyukun
PSRにのっかってバックエンドサーバを書く / Write a backend server using PSR
hyuyukun
0
99
phina.jsで弾幕シューティングを作る / Creating a bullet-hell shooter with phina.js
hyuyukun
0
310
ピアノ経験ゼロからピアノを練習して弾いてみた / I practiced and played the piano from zero piano experience.
hyuyukun
1
160
Blenderに入門しました / I started to use Blender
hyuyukun
0
170
気軽にパソコンを吹き飛ばせるようにするために / To initialize your computer easily
hyuyukun
0
110
僕っぽいことを喋るBotをマストドンで育てています / I'm growing a bot on mastodon that talks like me.
hyuyukun
0
150
4年と半年かけてようやくフロントエンドを書けるようになった / It took me 4 years and 6 months to be able to write the frontend
hyuyukun
0
360
Neofetchライクな自己紹介ツールyuyufetchを作った / Created yuyufetch, a Neofetch-like self-introduction tool
hyuyukun
1
370
世界観を考察するのが好き?Sound Horizonはいいぞ / Introduction to Sound Horizon
hyuyukun
0
1.1k
Other Decks in Technology
See All in Technology
Driving AI Adoption Using In-House GPUs to Serve Qwen
po3rin
0
230
いま好きなこと 最初はそんなに好きじゃなかった #tamagawadev
nishiuma
1
150
現場の暗黙知を継承するAIエージェント — 対話から生まれる長期記憶と Skills
atsukish
0
210
Backstageでつくるセルフサービスな社内開発基盤
kikunosuke75
1
170
Bet AI Day 2026丨バクラク Autopilot、業務システムの再設計
layerx
PRO
1
780
Bet AI Day 2026丨Production-Ready AI Agents — エンタープライズの実務を任せるための設計と運用
layerx
PRO
2
1.6k
tamachi.goを支える技術
rymiyamoto
0
130
[RSJ26] Flow as Flow: Modeling Robot Velocity Fields as Probability Velocity Fields
keio_smilab
PRO
0
170
Hub & Spoke 環境のネットワークルーティングを分解してみる
tsuyataku
1
500
AI駆動開発をチームに根付かせる - 「1行も書かない」チームがHarnessを育てた1年 -
kenichirokimura
6
3.6k
All About Sansan – for New Global Engineers
sansan33
PRO
1
1.5k
When Token Pruning is Worse than Random: Understanding Visual Token Information in VLLMs
sansantech
PRO
0
220
Featured
See All Featured
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
410
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Google's AI Overviews - The New Search
badams
0
1.6k
Discover your Explorer Soul
emna__ayadi
2
1.3k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
490
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.9k
What does AI have to do with Human Rights?
axbom
PRO
1
2.3k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.2k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
Paper Plane (Part 1)
katiecoart
PRO
1
10k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
260
Transcript
PHPカンファレンス振り返りと プロポーザルについて話します PHP Tech Talk Night ~ after phpcon 2026
2026/08/27 yuyukun / ピクシブ株式会社 1
ピクシブ株式会社 Pixiv Division / Pixiv Section バックエンドエンジニア / 24卒 PHP
/ Google Cloud / Neovim yuyukun ヤニすう / ヤニねこ / きみ死ぬ / リゼロ 2
アジェンダ • 僕のPHPカンファレンスの振り返り ◦ プロポーザルの紹介と考え方 ◦ ブースにて実施していたライブコーディングの紹介 ◦ 感想 •
残り時間がある限り、今回採択されなかったプロポーザルの話 3
PHPカンファレンスの振り返り 4
僕のPHPカンファレンスの振り返り • 入社してからカンファレンスは 初参加 • カンファレンスにプロポーザルを 初めて投稿した • 当日セッションを聞いた •
企業ブースにて ライブコーディングをした 5
プロポーザル x2(20分x1, 5分x1) 6
プロポーザル その1(20分) 7
プロポーザル その1(20分) / 内容 • pixiv小説には、小説を執筆する にあたって独自の記法によって 章やルビなどを表現することが できる •
バックエンドはこれを正規表現 でパースしていたので、 これを文法定義とそこから 生成されるパーサーで処理 8
プロポーザル その1(20分) / 内容 • フロントエンド向けの パーサーは既に存在する • see: pixiv/pixiv-novel-parser
• TypeScript <> PHP間で共通化 してパーサーを管理するように • 移行してみてよかったこと、 大変だったこと 9
プロポーザル その2 10
プロポーザル その2(5分) / 内容 • PSR-14: EventDispatcher • これを実装した symfony/event-dispatcher
を 読んでみよう、という話 • コード自体は300行程度と シンプル。キューではなく 多次元配列での管理 11
僕のプロポーザル内容の考え方 • 普段の業務から ◦ 関わっているプロダクトの最近リリースした機能のPHPや技術 まわりの内容 ◦ 自分はプロダクトの話も好きなので、これがあるとどういった機能 が実現できて嬉しいのか、とか、実際にここで使われてます、 みたいな話ができるので自分も話してて楽しい
12
僕のプロポーザル内容の考え方 • なんとなく使っているライブラリやコードを丁寧に追う話 ◦ 使う分には、それがどういった機能を提供しているのかを知って いれば良い ◦ 一方で、中の実装を知っていると、よりコードの挙動を 想像できてトラブルシューティング時に活用できるかも ◦
設計例として自分の知識にもなる 13
本命 14
今回は採択されなかったのでここでお 話させてください 🙏 15
当日のpixivブースのライブコーディング • といいつつ、AIになおさせていたが...。 • メインの成果物 • pixiv小説記法パーサーが出力したASTのデモ • 小説本文のリアルタイムプレビュー(pixivにも欲しい...) 16
小説本文のリアルタイムプレビュー 17
プレビューの実装 (index.php) • JavaScriptからは入力イベントで /api/render.php にPOST 18
プレビューの実装 (api/render.php) • JavaScriptからは入力イベントで /api/render.php にPOST • PHPからは入力テキストから HTMLの文字列を構成して返す 19
プレビューの実装 (Renderer/HtmlRenderer.php) • JavaScriptからは入力イベントで /api/render.php にPOST • PHPからは入力テキストから HTMLの文字列を構成して返す •
PHPカンファレンスなのでHTML の組み立てをPHPで 20
プレビューの実装 (api/render.php) • JavaScriptからは入力イベントで /api/render.php にPOST • PHPからは入力テキストから HTMLの文字列を構成して返す •
PHPカンファレンスなのでHTML の組み立てをPHPで 21
pixiv小説記法パーサーが出力した ASTのデモ 22
PHPカンファレンス 2026 現地参加してみて • 1日、あっという間でした...! • ブースでお話しする時間も多く楽しいものだったんですが、その合間に セッションを聞いたり、他の企業ブースでお話を聞いたりしようとすると 時間が足りない •
PHP 8.6のこと、AIまわりの活用方法、JITとOPCacheの計測の お話が個人的に印象に残っています ◦ AI活用...個人的にも気になるトピックなので次はAIの話をしたい 23
残りの時間はプロポーザルの話 24
プロポーザル その1(20分) 25
pixiv小説で小説本文情報を扱う場所 • HTML Metaタグ • リンク共有時のOGP画像 ◦ タグを除去したテキスト 部分のみの抽出 26
pixiv小説で小説本文情報を扱う場所 • 画像メーカー • pixivFACTORYでつくる ◦ PHPで画像のレンダリング、 PDF生成をする必要がある ◦ ノード→文章構造として整理→
組版(レイアウト調整) 27
タグ除去処理の従来の実装 • それぞれのタグを順番に処理 • タグとテキスト部分のマッチに は正規表現を利用 28
タグ除去処理の従来の実装 • チャプターとルビの入れ子 テキストを処理するケース • パーツに分解すれば何を やっているのかまだ読める /\[chapter: \]\n{0,1}/' :
chapterタグ + 改行にマッチ • (?: )* ◦ ?: はグループ化であり、マッチした部分を取り出さな い、ということを明記している。 ◦ [^\[\]]+ ▪ `タグ以外のテキストで構成される部分 ◦ \[\[rb:[^\]]+\]\] ▪ ルビタグで構成される部分 29
タグ除去処理の従来の実装 • チャプターとルビの入れ子 テキストを処理するケース • パーツに分解すれば何を やっているのかまだ読める • 苦しいポイント ◦
チャプター→ルビ、では 上手く処理できない 30
< よさそう ...? 31
破滅的バックトラック • ユーザが [chapter:あいうえおかきくけこ... と書き、最後の ] を書き 忘れたケース 1. 2.
3. 4. あいうえおかきくけこ... 全体で1つの塊として試す ➔ 失敗 あいうえおかきくけ と こ の2つに分けて試す ➔ 失敗 あいうえおかきく と けこ の2つに分けて試す ➔ 失敗 あいうえおかきく と け と こ の3つに分けて試す ➔ 失敗 • 文字数が増えるごとに組み合わせが指数関数的(O(N^2))に増大 してしまう 32
解決策としてはアトミックグループを利用すること • 正規表現で一度マッチしたパターンをバックトラックの対象 から除外することで、不要な組み合わせの総当たり施行を防ぐ 33
< 気がつかなかった ...! 34
バックエンドのパーサー移行開始 35
バックエンドのパーサー移行 • フロントエンド側 ◦ peg.js パーサージェネレータを利用 ◦ 文法定義とパーサーのJavaScriptコードを生成 ◦ →
PHPも同じ文法定義からパーサーを生成できていたい • pegjs/pegjs は最終コミットが7年前 ◦ → 後継の peggy.js が開発され、メンテナンスされている ◦ → JSの代わりにPHPのコードを生成する MarcelBolten/phpeggy を発見!!! 36
peggy.js の文法定義 (一部) 37
peggy.js の文法定義 (PHPによるutilityの定義) 38
peggy.js の文法定義 (一部) 39
TypeScriptとPHPで構文の共通化 • phpeggyのおもしろいところ。コメントでPHP向けを定義する。 40
TypeScriptとPHPで構文の共通化 41
バックエンドのパーサー移行 • JavaScriptのコードをPHPに置き変えて小説本文をパース できることを確認できるPoCが半日程度 ◦ スクリプトを書いて既存の小説作品2700万件に適用したが エラーもなし • パフォーマンスまわり 42
パフォーマンス (参考程度に • 文庫本は大体8〜10万文字 • pixiv小説で投稿できる最大文字数30万文字で、今回の要件では十分 • peggy自体に解析時にキャッシュを効かせるオプションがある 文字数 初期
キャッシュ+最適化 50K 1,051ms 95ms 100K 3,814ms 502ms 300K 30,801ms 989ms 43
パーサーの運用 • 構文ファイルは1つ ◦ JavaScript向け/PHP向けにパーサーを生成するスクリプトを 用意 • それぞれnpmパッケージ/Composerパッケージとして配布、 リポジトリへ取り込み 44
移行してみてどうだったか • バックエンドの既存のタグ処理の仕様ズレがたくさん出てきた ◦ フロントエンド側でもテストを記述してもらい、その差分と正しい 挙動は何か、を定義してまわった ◦ 特にタグの入れ子まわりが.......... • ASTのまま扱うことで良かった反面、実装が大変になった
ところもある 45
例: 改行ごとに文章を分割する • 1文ごと処理したい 46
例: 改行ごとに文章を分割する • 1文ごと処理したい 47
まとめ • 僕のPHPカンファレンスの振り返り ◦ プロポーザルの紹介と考え方 ▪ 普段の業務から好きな話をプロポーザルにする ◦ ブースにて実施していたライブコーディングの紹介 ◦
感想 • プロポーザルの話 ◦ peggy.js を採用してPHPとTypeScriptの文法定義を共通化 して運用してます 48
Fin. 49