---
title: PHPの非同期対応 これまでとこれから
tags: 
author: [_ma_me_](https://image.docswell.com/user/1313108)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/2JVVPKQYJQ.jpg?width=480
description: 同期処理と非同期処理の違いを整理し、従来の stream_select() が持つ OS 依存やファイルディスクリプタ数の制限といった課題を説明しています。その上で PHP 8.6 で導入された Polling API（Io\Poll）を紹介し、Context・Backend・StreamPollHandle・Event・Watcher の 5 つの構成要素と基本的な使用手順を示しています。また、ReactPHP・Swoole・FrankenPHP などの非同期ライブラリが共通の I/O 監視基盤として Io\Poll を採用する可能性があることにも触れ、今後の PHP 非同期処理の展望を示しています。  おすすめタグ：PHP,非同期,Polling API,Io\Poll,ストリーム監視
published: August 15, 26
canonical: https://image.docswell.com/s/1313108/59NLLJ-2026-08-15-213955
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/2JVVPKQYJQ.jpg)

PHPの非同期対応
これまでとこれから
PHP 8.6 / Polling API
1


# Page. 2

![Page Image](https://bcdn.docswell.com/page/5EGLPQWWJL.jpg)

プロフィール
発表者
ma@me
所属
最近の業務
品質改善・不具合対応
2


# Page. 3

![Page Image](https://bcdn.docswell.com/page/4JQY2K3Q7P.jpg)

同期と非同期の整理
同期
1つの処理が終わるまで、次の処理へ進まない。
例 電卓アプリ、画像変換アプリ、CSV集計アプリ
非同期
待ち時間に別の処理へ進める。完了順は前後することがある。
例 チャットアプリ、通知アプリ、音声通話アプリ
3


# Page. 4

![Page Image](https://bcdn.docswell.com/page/K74WLP1YE1.jpg)

同期的なチャット：相手の処理終了を待つ
Aさんが投稿する
投稿中、Bさんは待機する
Aさん
こんにちは！
Bさん・送信待ち
はじめまして！
Aさんの投稿終了後、Bさんが投稿する
Bさん
はじめまして！
一つの投稿処理が終わるまで、次の投稿処理へ進まない
4


# Page. 5

![Page Image](https://bcdn.docswell.com/page/LJ1YL9GNEG.jpg)

非同期的なチャット：届いた投稿から処理する
AさんとBさんがそれぞれ投稿する
相手の投稿終了を待たない
Aさん
こんにちは！
Bさん
はじめまして！
サーバーは届いた投稿から処理・表示する
Bさん・先に到着
はじめまして！
Aさん・次に到着
こんにちは！
非同期では I/O（入出力）の完了順が一定でないため、
処理可能になったかどうか、I/O を監視する必要がある
5


# Page. 6

![Page Image](https://bcdn.docswell.com/page/GJWGVQ5M72.jpg)

PHP4 からある標準 I/O 監視関数 stream_select()
複数のストリームを監視し、読み書き可能になったものを返す。
イベントループではなく、OS の select() を利用する I/O 監視関数。PHPマニュアル
function stream_select(
?array &amp;$read,
?array &amp;$write,
?array &amp;$except,
?int $seconds,
?int $microseconds = null
): int|false
とても古の PHP っぽい、配列と参照渡しをふんだん使ったインターフェース
6


# Page. 7

![Page Image](https://bcdn.docswell.com/page/4EZL4WNM73.jpg)

stream_select() のメリット・デメリット
メリット
外部拡張なしで利用できる
汎用性が高く、Linux / macOS / Windows など、主要な OS で利用できる
デメリット
監視できるファイルディスクリプタ番号は、多くの環境で 1024 未満
監視対象が増えるほど、走査コストが大きくなる
エッジトリガーやワンショット通知を利用できない
7


# Page. 8

![Page Image](https://bcdn.docswell.com/page/Y76W3G857V.jpg)

PHP 8.6 の Polling API（Io\Poll）で
非同期 I/O の監視基盤が強化
複数のストリームが読み書き可能になったことを監視する
PHP 共通のポーリング API を提供される
select()以外の各 OS が特化して実装した監視 API を利用できるようになる
＊強化されるのは I/O 監視 API であり。イベントループではない点に注意。
RFC：https://wiki.php.net/rfc/poll_api
8


# Page. 9

![Page Image](https://bcdn.docswell.com/page/G75MLV9G74.jpg)

イメージ図
PHP のコード
↓ 監視を登録・待機
↑ Watcherを返す
Polling API（Io\Poll）
↓ OS基盤で監視
↑ 準備完了を通知
Linux
macOS / BSD
epoll
kqueue
Solaris
Windows
その他POSIX
event ports
WSAPoll
poll
9


# Page. 10

![Page Image](https://bcdn.docswell.com/page/9J29L32DER.jpg)

（
）
Polling API Io\Poll の構成要素５つ
1. Context
2. Backend
3. StreamPollHandle
4. Event
5. Watcher
10


# Page. 11

![Page Image](https://bcdn.docswell.com/page/DEY4Q1YMJM.jpg)

ソースの流れ
Handle 部分はインターフェースのみ提供されているので、
実際に使うにはラッパークラスを自分で用意する必要がある。省略しているがここが一番
大変。
サンプルコード：https://wiki.php.net/rfc/poll_api#usage_examples
use Io\Poll\{Context, Event, StreamPollHandle};
// 1. OSに適したBackendを自動選択してContextを作る
$poll = new Context();
// 2. PHPのストリームを監視可能なHandleで包む
$handle = new StreamPollHandle($stream);
// 3. Readを登録。Watcherで条件変更・解除ができる
$watcher = $poll-&gt;add($handle, [Event::Read]);
// 4. 最大1秒待機し、発火したWatcherの配列を受け取る
$readyWatchers = $poll-&gt;wait(1);
11


# Page. 12

![Page Image](https://bcdn.docswell.com/page/VJNYK2P378.jpg)

PHP の非同期処理を支えるライブラリや実行基盤への
影響
ReactPHP・Revolt・Swoole・FrankenPHP など
内部にある I/O 監視部分で、共通 APIの Io\Poll が採用される可能性あり
各プロジェクトによる採用は未確定だが、今後の動向に要注目
12


# Page. 13

![Page Image](https://bcdn.docswell.com/page/YE9PV13PJ3.jpg)

PHP の非同期の未来は明るい
ご清聴ありがとうございました
13


