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
Fiberとは何か?PHPが“非同期言語”になった瞬間
Search
kouki.miura
April 16, 2026
Programming
92
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Fiberとは何か?PHPが“非同期言語”になった瞬間
PHP8.1で追加されたFiberの説明です。
kouki.miura
April 16, 2026
More Decks by kouki.miura
See All by kouki.miura
医療DXって何?~電子カルテ標準仕様まで10分で理解する~
koukimiura
1
41
アプリ開発者が知っておくべき『トランザクション分離レベル』とRead Committed の罠
koukimiura
0
70
フルスタックTypeScript入門 ~Hono RPCとZodで実現する型共有~
koukimiura
0
50
ITヒヤリハットを整理してみた ~ライフサイクルと原因から考える再発防止策~
koukimiura
1
130
ReactとVueは仲良くできるのか?
koukimiura
0
41
ポジティブアウトカムを用いた医療費削減の可能性について
koukimiura
0
79
VueSapporo#2
koukimiura
0
61
Vuetify4 v-calendarをちゃんと理解する
koukimiura
0
74
認証統合から始めるフロントエンドの機能単位開発 — マイクロサービス思想の適用
koukimiura
0
140
Other Decks in Programming
See All in Programming
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
170
Android CLI
fornewid
0
200
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
380
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
510
今さら聞けない .NET CLI
htkym
0
170
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
4
1.8k
作るコストが小さくなった時代 幸せに働くために改めて考えたいこと 〜エンジニアとして価値を出し続けるために注視している二分野〜
yuppeeng
0
170
SREの積み重ねがAI駆動開発のガードレールになった ― 7つの実践/SRE Guardrails The 7
tomoyakitaura
9
5.9k
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
3.3k
Foundation Models frameworkで画像分析
ryodeveloper
1
350
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
610
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
150
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
How to train your dragon (web standard)
notwaldorf
97
6.7k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.7k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
230
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
230
The Spectacular Lies of Maps
axbom
PRO
1
880
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.5k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
590
How Software Deployment tools have changed in the past 20 years
geshan
1
34k
For a Future-Friendly Web
brad_frost
183
10k
My Coaching Mixtape
mlcsv
0
180
Transcript
Fiberとは何か?PHPが“非同期言語”になった瞬間 2026.04.16 札幌PHP勉強会 ナイトセッション #1 三浦 恒樹 (MIURA KOUKI) 診療情報管理士
上級医療情報技師 医用画像情報専門技師 ドゥウェル株式会社
長男が飼っている ハリネズミがアイコン INTRODUCE ・ドゥウェル株式会社 (医療系IT開発・導入会社)に所属 ・マネージャー(プレイング・マネージャー) ・TypeScript, Vue.js, Node.js, Java,C#,
PHP ・3児の父 ・休日は子どものサッカー観戦 ・参加している勉強会 札幌PHP勉強会、JBUG札幌、JavaDO、ゆるWeb勉強会、えびてく、 クラメソ札幌IT勉強会(仮)、AWS初心者LT会in札幌、札幌すごいAI会、 札幌IT石狩鍋、函館本線沿線勉強会、VueSapporo、さっぽろ医療IT勉強会 等 is the NIHON KOHDEN Group
・#1 なぜ非同期が必要か ・#2 Node.jsとの違い ・#3 Fiberとは何か ・#4 Fiberの基本動作 ・#5 何がすごいのか
・#6 何ができるのか ・#7 まとめ INDEX
#1 なぜ非同期が必要か foreach ($urls as $url) { // 開始ログ $start
= (new DateTime())->format('H:i:s.v'); echo "[$start] START: $url\n"; // 取得実行 $data = @file_get_contents($url); // 完了ログ $end = (new DateTime())->format('H:i:s.v'); $status = $http_response_header[0] ?? 'Connection Failed'; echo "[$end] END : $status\n"; echo "-------------------------------------------\n"; } [22:30:51.899] START: URL1 [22:30:52.818] END : HTTP/1.1 200 OK ------------------------------------------- [22:30:52.820] START: URL2 [22:30:53.362] END : HTTP/1.1 200 OK ------------------------------------------- 1つずつ処理される ・同期・ブロッキング ・I/O待ちで止まる
#2 Node.js との違い async function fetchLog(url) { const time =
() => new Date().toISOString().slice(11, 23); console.log(`[${time()}] START: ${url}`); const res = await fetch(url).catch(e => ({ status: 'Error' })); console.log(`[${time()}] END : ${res.status} | ${url}`); } [22:45:07.717] START: URL1 [22:45:07.886] START: URL2 [22:45:08.479] END : 200 | URL1 [22:45:08.482] END : 200 | URL2 Node.jsは非同期が前提 ・async/await →PHPは「遅い」と言われがち
#3 Fiber とは何か ・PHP 8.1 で追加された (2021.11) ・軽量コルーチン ・処理を止めて戻せる → 処理を一時停止・再開できる仕組み
#4 Fiber の基本動作 <?php $fiber = new Fiber(function (): void
{ // この行で 'suspending...' を返して停止する $value = Fiber::suspend('suspending...'); echo 'Value used to resume fiber: ', $value, PHP_EOL; }); // Fiberを開始したが、suspendで 'suspending...' が返却されて止まっている $value = $fiber->start(); echo 'Value from fiber suspending: ', $value, PHP_EOL; $fiber->resume('do resume!'); // 'do resume!' を渡してFiberを再開する Value from fiber suspending: suspending... Value used to resume fiber: do resume! start()するとsuspend まで実行して止まる resume()すると止まってい たところから再開する
#5 何がすごいのか ・処理を止めて戻せる (再掲) ・実行制御を自分でコントロールできる → 非同期処理も”同期っぽく書ける” ! 並列処理(マルチスレッド)ではなく、並行処理を記述できる制御API
#6 何ができるのか ・非同期ライブラリの基盤 ・Amp ・Swoole → アプリ開発者は直接使わない https://github.com/amphp/amp
#6 何ができるのか $task = new Fiber(function (): mixed { echo
" [Fiber] 処理開始。2秒待ちます...\n"; // 現在時刻に2秒足したものを「目標時刻」とする $targetTime = microtime(true) + 2.0; // 目標時刻になるまで、何度も「中断(suspend)」してメインに戻る while (microtime(true) < $targetTime) { Fiber::suspend(); } echo " [Fiber] 2秒経ったので終了します。\n"; return "完了データ"; }); // --- 外部(メインループ / スケジューラ) --- echo "メイン: 監視を開始します。\n"; $task->start(); $count = 0; while (true) { $count++; // 終了しているかチェックしてからresume if ($task->isTerminated()) { break; } $result = $task->resume(); // returnされた値は、最後のresumeの後に getReturn() で取得するのが一般的 if ($task->isTerminated()) { echo "メイン: Fiberから届きました -> " . $task->getReturn() . "\n"; break; // 届いたら即座にループを抜ける } else { echo "メイン: まだかな? (ループ回数: $count)\n"; } usleep(500000); } echo "メイン: 終了しました。\n"; メイン: 監視を開始します。 [Fiber] 処理開始。2秒待ちます... メイン: まだかな? (ループ回数: 1) メイン: まだかな? (ループ回数: 2) メイン: まだかな? (ループ回数: 3) メイン: まだかな? (ループ回数: 4) [Fiber] 2秒経ったので終了します。 メイン: Fiberから届きました -> 完了データ メイン: 終了しました。 結果 ループで0.5秒ごとにタ スク状況を確認する 2秒経過したらタ スク終了する
ご清聴ありがとうございました。 #7 まとめ ・PHP 8.1 で追加された (2021.11) ・軽量コルーチン ・処理を止めて戻せる → 実行制御を自分でコントロールできる
お知らせ 4/27(月) 19:00~ 5/23(土) 17:30~
おまけ pthreadsは? parallelは? https://www.php.net/manual/en/book.pthreads.php https://www.php.net/manual/en/book.parallel.php