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
42
アプリ開発者が知っておくべき『トランザクション分離レベル』とRead Committed の罠
koukimiura
0
73
フルスタックTypeScript入門 ~Hono RPCとZodで実現する型共有~
koukimiura
0
54
ITヒヤリハットを整理してみた ~ライフサイクルと原因から考える再発防止策~
koukimiura
1
140
ReactとVueは仲良くできるのか?
koukimiura
0
42
ポジティブアウトカムを用いた医療費削減の可能性について
koukimiura
0
81
VueSapporo#2
koukimiura
0
61
Vuetify4 v-calendarをちゃんと理解する
koukimiura
0
77
認証統合から始めるフロントエンドの機能単位開発 — マイクロサービス思想の適用
koukimiura
0
140
Other Decks in Programming
See All in Programming
20260722_microCMSで考える、AI時代のコンテンツ運用設計
yosh1
0
290
Google Apps Script で Ruby を動かす
kawahara
0
130
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
200
これって Effect でできたのでは? / TSKaigi Mashup Kansai #2
susisu
0
140
「寝てても仕事が進む」Claude Codeで組む第二の脳
tomoyafujita2016
0
280
Claude Team Plan導入・ガイド
tk3fftk
0
250
AI時代に設計が 最大の生産性レバーになる 意図駆動開発とデータを消さない設計|Don't Delete Your Data or Your Intent — Design as the Deepest Lever in the AI Era
tomohisa
1
590
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
170
自動化したのに回らないテスト運用の壁ーAI時代の品質責任と生産性
mfunaki
0
120
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
140
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
3
750
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
210
Featured
See All Featured
Building Applications with DynamoDB
mza
96
7.2k
GitHub's CSS Performance
jonrohan
1033
470k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
380
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
350
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
290
Done Done
chrislema
186
16k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
200
Unsuck your backbone
ammeep
672
58k
My Coaching Mixtape
mlcsv
0
190
sira's awesome portfolio website redesign presentation
elsirapls
0
320
Typedesign – Prime Four
hannesfritz
42
3.1k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
340
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