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
83
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
ReactとVueは仲良くできるのか?
koukimiura
0
16
ポジティブアウトカムを用いた医療費削減の可能性について
koukimiura
0
56
VueSapporo#2
koukimiura
0
48
Vuetify4 v-calendarをちゃんと理解する
koukimiura
0
61
認証統合から始めるフロントエンドの機能単位開発 — マイクロサービス思想の適用
koukimiura
0
120
VueエンジニアがReactを触って感じた_設計の違い
koukimiura
0
210
Laravel入門:最小構成で理解するMVC
koukimiura
0
140
VueSapporo#1
koukimiura
0
76
Vue.jsを10分で再定義する
koukimiura
1
73
Other Decks in Programming
See All in Programming
Vite+ Unified Toolchain for the Web
naokihaba
0
320
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
11
5.8k
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
660
Composerを使ったサプライチェーン攻撃の様子を眺めてみる #phpstudy
o0h
PRO
2
250
dRuby over BLE
makicamel
2
380
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
790
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
260
net-httpのHTTP/2対応について
naruse
0
500
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
710
RTSPクライアントを自作してみた話
simotin13
0
610
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
210
JavaDoc 再入門
nagise
1
370
Featured
See All Featured
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.5k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
590
We Are The Robots
honzajavorek
0
250
Speed Design
sergeychernyshev
33
1.9k
Building the Perfect Custom Keyboard
takai
2
800
How to build a perfect <img>
jonoalderson
1
5.7k
What does AI have to do with Human Rights?
axbom
PRO
1
2.2k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
400
The World Runs on Bad Software
bkeepers
PRO
72
12k
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