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
81
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
ポジティブアウトカムを用いた医療費削減の可能性について
koukimiura
0
53
VueSapporo#2
koukimiura
0
46
Vuetify4 v-calendarをちゃんと理解する
koukimiura
0
60
認証統合から始めるフロントエンドの機能単位開発 — マイクロサービス思想の適用
koukimiura
0
120
VueエンジニアがReactを触って感じた_設計の違い
koukimiura
0
210
Laravel入門:最小構成で理解するMVC
koukimiura
0
140
VueSapporo#1
koukimiura
0
73
Vue.jsを10分で再定義する
koukimiura
1
72
なぜVue開発は速いのか?-Vite入門
koukimiura
0
93
Other Decks in Programming
See All in Programming
Webフレームワークの ベンチマークについて
yusukebe
0
160
The Arts and Crafts of Work in the AI Era — Toward Mastery in Software Development
kuranuki
1
750
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
680
肥大化するレガシーコードに立ち向かうためのインターフェース分離と依存の逆転 / JJUG CCC 2026 Spring
hirokunimaeta
0
530
正しくソフトウェアを作る、前提を疑うための認知の視点 / doubt-premise
minodriven
20
6.5k
New "Type" system on PicoRuby
pocke
1
820
AI時代のUIはどこへ行く?その2!
yusukebe
21
7k
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
190
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
3.6k
技術記事、 専門家としてのプログラマ、 言語化
mizchi
4
1.3k
The ROI of Quarkus for Spring Boot Applications
hollycummins
0
110
技術記事、AIに書かせるか、自分で書くか? 〜それでも私が自分の手で書く理由〜 / #QiitaConference
jnchito
2
1.4k
Featured
See All Featured
30 Presentation Tips
portentint
PRO
1
320
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
160
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
390
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Speed Design
sergeychernyshev
33
1.8k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
440
Measuring & Analyzing Core Web Vitals
bluesmoon
9
860
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
200
Being A Developer After 40
akosma
91
590k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
330
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
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