Upgrade to Pro — share decks privately, control downloads, hide ads and more …

がんばれ PHP Fiber

がんばれ PHP Fiber

インフィニットループ仙台支社勉強会 OpenIL仙台 vol.1 発表資料
がんばれPHP Fiber 五十嵐進士
告知記事
https://www.infiniteloop.co.jp/blog/2018/05/openilsendai-vol1/

Infiniteloop

October 17, 2023
Tweet

More Decks by Infiniteloop

Other Decks in Programming

Transcript

  1. 単純な例 単純な例 function func() { return Fiber::yield(1); } $fiber =

    new Fiber(function ($a) { $b = Fiber::yield($a); $c = func(); return $c.$b; }); echo $fiber->resume(2); // echo 2 echo $fiber->resume("world"); // echo 1 echo $fiber->resume("hello "); // echo "hello world"
  2. function func() { return/* 11 */ Fiber::yield(1)/* 8 */; }

    $fiber =/* 1 */ new Fiber(function ($a) { $b =/* 6 */ Fiber::yield($a)/* 3 */; $c =/* 12 */ func()/* 7 */; return $c.$b;/* 13 */ }); echo/* 4 */ $fiber->resume(1)/* 2 */; // echo 3 echo/* 9 */ $fiber->resume("world")/* 5 */; // echo 1 echo/* 14 */ $fiber->resume("hello ")/* 10 */; // echo "hello
  3. I/O多重化(てきとー) I/O多重化(てきとー) // query()やfetchAll()が内部でノンブロッキングI/OとFiber::yield()を $scheduler = new Scheduler(); $scheduler->add(new Fiber(function()

    { $db = ConnectionPool::getConnection(); var_dump($db->query('なんかSQL1')->fetchAll()); })); $scheduler->add(new Fiber(function() { $db = ConnectionPool::getConnection(); var_dump($db->query('なんかSQL2')->fetchAll()); })); while ($scheduler->run()) {} // 中でFiberをresume
  4. 説明⽤のよくある表 説明⽤のよくある表 プロセス OSスレッド Fiber メモリ空間 分離 共有 共有 タイムスライスで

    切り替え あり あり なし I/Oブロックで 切り替え あり あり なし ⽣成コスト 重い 中くらい 軽い 切り替えコスト 重い 中くらい 軽い 複数コア利⽤ できる できる だめ
  5. $f = new Fiber(function () { return array_map(function ($i) {

    return Fiber::yield($i); // 例外飛ばす }, ['a', 'b']); });