最新のインターネット技術の継続的な発展に伴い、Web サイトへのアクセス数が増加しており、サーバーの同時処理能力に対する要件も高まっています。サーバーの同時処理能力を向上させる方法は、すべての開発者が直面する必要がある問題です。これに関連して、PHP8.0 では Fibers の新機能が導入され、PHP 開発者が新しい同時処理方法を習得できるようになりました。
繊維とは何ですか?
まず第一に、ファイバーとは何かを理解する必要があります。ファイバーは、PHP コードの非同期処理を効率的にサポートする軽量のスレッドです。従来の PHP コードはシングルスレッドであり、実際には非同期操作を実装できず、多くの場合、I/O 操作の完了を待つ必要があり、不必要なブロックが発生します。 Fibers の登場によりこの問題は解決され、PHP コードが Node.js などの他の言語と同様に同時処理をサポートできるようになりました。
ファイバーを使用して同時実行を実現する
ファイバーを使用して同時実行を実現する方法について説明します。
PHP8.0 では、Fibers は Swoole 拡張機能に基づいて実装されているため、最初に Swoole 拡張機能をインストールする必要があります。これは、PECL を通じてインストールできます。
pecl install swoole
Fiber を使用して同時実行を実現するには、Fibre オブジェクトを作成する必要があります。 Fiber オブジェクトの作成は、匿名関数またはクラス メソッドを作成することで実現できます。例:
$fiber = new SwooleFiber(function() { // 这里是并发要执行的代码 }); 或 class MyClass { public function onReceive($server, $fd, $reactor_id, $data) { // 这里是并发要执行的代码 } } $fiber = new SwooleFiber([$myClass, 'onReceive']);
Fiber オブジェクトを作成した後、Fiber を開始する必要があります。 Fiber を開始するには、start
メソッドまたは suspend
メソッドを使用できます。 start
メソッドを使用して Fiber をすぐに起動し、Fiber で定義されたコードを実行します。例:
$fiber->start();
および suspend
メソッドは、Fibre の実行を一時停止し、次の実行を待つことができます。例:
$fiber->suspend();
Fiber では、swoole_fiber_switch
関数を使用して Fiber の実行を切り替えます。例:
function foo() { echo 'foo '; yield; echo 'bar '; yield; echo 'baz'; } $fiber1 = new SwooleFiber($foo); $fiber2 = new SwooleFiber($foo); $fiber1->start(); $fiber2->start(); while ($fiber1->getStatus() !== SwooleFiber::STATUS_DEAD || $fiber2->getStatus() !== SwooleFiber::STATUS_DEAD) { if ($fiber1->getStatus() !== SwooleFiber::STATUS_DEAD) { swoole_fiber_switch($fiber1); } if ($fiber2->getStatus() !== SwooleFiber::STATUS_DEAD) { swoole_fiber_switch($fiber2); } }
上記の例では、2 つの Fiber オブジェクトを作成し、交互に実行して foobarbaz
を出力しました。
Fibre を手動で切り替えることに加えて、Swoole 拡張機能は、便利な同時処理のためのいくつかのコルーチン API も提供します。たとえば、Co::create
メソッドを使用してコルーチン オブジェクトを作成し、Co::Parallel
を使用して複数のコルーチンを並列実行できるようにします。例:
$urls = [ 'http://example.com/foo', 'http://example.com/bar', 'http://example.com/baz', ]; $coros = []; foreach ($urls as $url) { $coros[] = Co::create(function() use ($url) { $html = file_get_contents($url); return strlen($html); }); } $results = Co::parallel($coros);
上記の例では、3 つのコルーチン オブジェクトを作成し、それぞれ 3 つの URL にアクセスし、最後に Co::Parallel
メソッドを使用してこれら 3 つのコルーチンを並列化しました。結果と返却。
概要
Fibers は PHP8.0 で導入された新機能で、Swoole の拡張同時処理機能を最大限に活用します。 Fibers を使用すると、PHP コードの非同期処理を簡単に実装でき、サーバーの同時処理能力が向上します。もちろん、繊維の使用にも注意が必要であり、資源競争などの問題を避けるように注意する必要があります。この記事での紹介が、PHP 開発者がファイバーをより深く理解し、より適切な同時実行処理を実行するのに役立つことを願っています。
以上がPHP8.0 でファイバーを使用して同時実行性を実現する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。