同時実行性と並列性は、しばしば同じ意味で使用されますが、特にアプリケーションのパフォーマンスの観点では、明確な意味を持ちます。 PHP アプリケーションでは、PHP の同期実行モデルにより、これらの概念を管理することが困難になる場合があります。ただし、アプリケーションの要件に応じて、同時実行性と並列処理を効果的に処理するために利用できる手法やツールがいくつかあります。
PHP は基本的にシングルスレッド言語であるため、並列処理を実現するには通常、追加のライブラリまたはツールが必要です。ただし、同時実行性は、適切なアプローチを使用すれば、PHP の同期モデル内で処理できます。
PHP の同時実行性は、さまざまな方法で実現できます。
PHP は、プロセスを管理するための pcntl (プロセス コントロール) 拡張機能を提供します。この拡張機能を使用すると、新しいプロセスをフォークすることができ、それぞれが別のタスクを同時に処理できます。
例:
<?php if (pcntl_fork() == -1) { die('Could not fork'); } elseif ($pid == 0) { // Child process logic echo "Child process\n"; exit; } else { // Parent process logic echo "Parent process\n"; pcntl_wait($status); // Wait for child process to finish } ?>
このアプローチでは、子プロセスをフォークしてタスクを並列処理することで同時実行が可能ですが、各プロセスが独立して実行されるため、真の並列処理ではありません。
制限事項:
pthreads 拡張機能により、PHP でマルチスレッドを実装できるようになりました。これにより、PHP が同じプロセス内でスレッドを作成できる真の並列処理が提供されました。ただし、この拡張機能は PHP 7.4 の時点で非推奨となり、推奨されなくなりました。
代替手段: PHP の新しいバージョンの場合は、並列 (以下を参照) などのより最新の技術や、メッセージ キューなどの外部サービスを使用する必要があります。
PHP で並列処理 (タスクの真の同時実行) を実現するには、マルチ処理機能またはマルチスレッド機能が必要です。 PHP には言語レベルでこれをサポートする機能が組み込まれていませんが、並列処理を実装できる外部ライブラリとツールがあります。
並列拡張機能は、PHP のマルチスレッドのための最新のソリューションです。これにより、PHP スクリプトで並列タスクを作成し、それらを異なる CPU コア間で同時に実行できるようになります。
例:
<?php if (pcntl_fork() == -1) { die('Could not fork'); } elseif ($pid == 0) { // Child process logic echo "Child process\n"; exit; } else { // Parent process logic echo "Parent process\n"; pcntl_wait($status); // Wait for child process to finish } ?>
これにより、マルチコア プロセッサを利用してタスクを並列実行できるようになります。並列拡張機能は、pthread よりもはるかに効率的で使いやすいです。
利点:
制限事項:
Gearman: Gearman は、タスクを複数のワーカーに分散できるジョブ サーバーです。これにより、PHP アプリケーションはタスクを複数のマシンまたはプロセスにオフロードして、同時実行性と並列性を実現できます。 Gearman は、非同期に分散および処理できるジョブに適しています。
RabbitMQ: RabbitMQ のようなメッセージ ブローカーは、複数のワーカーにタスクを分散するのに役立ちます。タスクをキューに送信することで、異なるワーカーがタスクを同時に処理できます。これは、タスクを互いに独立して実行できる場合に適したソリューションです。
ReactPHP と Swoole: イベント駆動型の同時実行の場合、ReactPHP や Swoole などのライブラリを使用して非同期タスクを処理できます。 ReactPHP ではノンブロッキング I/O 操作が可能で、アプリケーション内での同時リクエストをより効率的に行うことができます。 Swoole はコルーチンベースの並列処理を提供し、PHP が複数の実行スレッドを管理できるようにします。
PHP アプリケーションで同時実行性が必要になることが多い重要な領域の 1 つは、データベース クエリ、API 呼び出し、ファイルの読み取り/書き込みなど、I/O バウンドのタスクです。ノンブロッキング I/O の場合は、以下を使用できます。
ReactPHP は、ブロックせずに非同期 I/O 操作を処理できる低レベル ライブラリです。イベント ループを使用して、追加のスレッドやプロセスを必要とせずに複数のタスクを同時に処理します。
例:
<?php if (pcntl_fork() == -1) { die('Could not fork'); } elseif ($pid == 0) { // Child process logic echo "Child process\n"; exit; } else { // Parent process logic echo "Parent process\n"; pcntl_wait($status); // Wait for child process to finish } ?>
この例では、ReactPHP により、メインの実行をブロックすることなく HTTP リクエストを同時に処理できます。
Swoole は、非同期、並列、およびコルーチンの機能を提供する、高性能のコルーチン ベースの PHP 拡張機能です。タスクを同時並行的に処理するように設計されているため、多数のリクエストを同時に処理する必要がある PHP アプリケーションに最適です。
PHP は本質的に同時実行性や並列処理を処理するように構築されているわけではありませんが、これらの技術とライブラリは、複数のタスクを同時または並行して管理するのに役立ちます。 PHP で同時実行性と並列処理を扱う際の考慮事項をいくつか示します。
同時実行性 と 並列性 を処理するには、PHP が複数のプロセスとスレッドでどのように動作するかを理解する必要があります。 pcntl、Parallel などの拡張機能、または ReactPHP や Swoole などのライブラリを使用することで、開発者は複数のタスクを同時にまたは並行して処理できるため、I/O バウンドおよび CPU バウンドのパフォーマンスが向上します。バインドされたタスク。
適切なツールの選択は、I/O バウンドのタスク (ReactPHP または Swoole) を処理しているかどうか、または複数の CPU コアにわたるタスクを処理する必要があるかどうか (並列または pcntl を使用) など、アプリケーションの要件によって異なります。 .
以上がPHP アプリケーションでの同時実行性と並列性の処理: テクニックとツールの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。