ホームページ > バックエンド開発 > PHPチュートリアル > PHP アプリケーションでの同時実行性と並列性の処理: テクニックとツール

PHP アプリケーションでの同時実行性と並列性の処理: テクニックとツール

Patricia Arquette
リリース: 2025-01-04 04:10:39
オリジナル
158 人が閲覧しました

Handling Concurrency and Parallelism in PHP Applications: Techniques and Tools

PHP アプリケーションでの同時実行性と並列処理の処理

同時実行性と並列性は、しばしば同じ意味で使用されますが、特にアプリケーションのパフォーマンスの観点では、明確な意味を持ちます。 PHP アプリケーションでは、PHP の同期実行モデルにより、これらの概念を管理することが困難になる場合があります。ただし、アプリケーションの要件に応じて、同時実行性と並列処理を効果的に処理するために利用できる手法やツールがいくつかあります。


1.同時実行性と並列性

  • 同時実行性 は、アプリケーションが複数のタスクを切り替えて同時に処理できる能力を指します。必ずしもタスクを同時に実行する必要はありませんが、通常は実行をインターリーブすることにより、タスクを同時に実行しているかのような錯覚を与えます。
  • 並列処理 は、複数の CPU コアを利用して、複数のタスクを同時に、文字通り並列的に実行することを指します。

PHP は基本的にシングルスレッド言語であるため、並列処理を実現するには通常、追加のライブラリまたはツールが必要です。ただし、同時実行性は、適切なアプローチを使用すれば、PHP の同期モデル内で処理できます。


2. PHP での同時実行性の処理

PHP の同時実行性は、さまざまな方法で実現できます。

a. pcntl_fork() によるマルチプロセス (フォーク) の使用

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
}
?>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

このアプローチでは、子プロセスをフォークしてタスクを並列処理することで同時実行が可能ですが、各プロセスが独立して実行されるため、真の並列処理ではありません。

制限事項:

  • pcntl 拡張機能は、すべての PHP セットアップ (共有ホスティング環境など) で利用できるわけではありません。
  • プロセスのオーバーヘッドのため、大量の計算を必要とするタスクには理想的ではありません。

b.マルチスレッドでの pthread の使用 (非推奨)

pthreads 拡張機能により、PHP でマルチスレッドを実装できるようになりました。これにより、PHP が同じプロセス内でスレッドを作成できる真の並列処理が提供されました。ただし、この拡張機能は PHP 7.4 の時点で非推奨となり、推奨されなくなりました。

代替手段: PHP の新しいバージョンの場合は、並列 (以下を参照) などのより最新の技術や、メッセージ キューなどの外部サービスを使用する必要があります。


3. PHP での並列処理の処理

PHP で並列処理 (タスクの真の同時実行) を実現するには、マルチ処理機能またはマルチスレッド機能が必要です。 PHP には言語レベルでこれをサポートする機能が組み込まれていませんが、並列処理を実装できる外部ライブラリとツールがあります。

a.並列拡張機能の使用 (PHP 7.2 で推奨)

並列拡張機能は、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 よりもはるかに効率的で使いやすいです。

利点:

  • 最新の PHP バージョンとの真の並列処理を提供します。
  • スレッド間の並列実行と通信のためのシンプルな API。

制限事項:

  • 並列拡張機能はすべての PHP 環境で利用できるわけではありません。
  • これは主にコマンドライン PHP 用に設計されており、Web リクエストではうまく動作しない可能性があります。

b.外部ツールを使用した並列処理

  • Gearman: Gearman は、タスクを複数のワーカーに分散できるジョブ サーバーです。これにより、PHP アプリケーションはタスクを複数のマシンまたはプロセスにオフロードして、同時実行性と並列性を実現できます。 Gearman は、非同期に分散および処理できるジョブに適しています。

  • RabbitMQ: RabbitMQ のようなメッセージ ブローカーは、複数のワーカーにタスクを分散するのに役立ちます。タスクをキューに送信することで、異なるワーカーがタスクを同時に処理できます。これは、タスクを互いに独立して実行できる場合に適したソリューションです。

  • ReactPHP と Swoole: イベント駆動型の同時実行の場合、ReactPHPSwoole などのライブラリを使用して非同期タスクを処理できます。 ReactPHP ではノンブロッキング I/O 操作が可能で、アプリケーション内での同時リクエストをより効率的に行うことができます。 Swoole はコルーチンベースの並列処理を提供し、PHP が複数の実行スレッドを管理できるようにします。


4.同時 I/O の管理 (ノンブロッキング)

PHP アプリケーションで同時実行性が必要になることが多い重要な領域の 1 つは、データベース クエリ、API 呼び出し、ファイルの読み取り/書き込みなど、I/O バウンドのタスクです。ノンブロッキング I/O の場合は、以下を使用できます。

a. ReactPHP

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 リクエストを同時に処理できます。

b.スウール

Swoole は、非同期、並列、およびコルーチンの機能を提供する、高性能のコルーチン ベースの PHP 拡張機能です。タスクを同時並行的に処理するように設計されているため、多数のリクエストを同時に処理する必要がある PHP アプリケーションに最適です。


5. PHP における同時実行性と並列性に関する考慮事項

PHP は本質的に同時実行性や並列処理を処理するように構築されているわけではありませんが、これらの技術とライブラリは、複数のタスクを同時または並行して管理するのに役立ちます。 PHP で同時実行性と並列処理を扱う際の考慮事項をいくつか示します。

  • リソース管理: 同時実行性と並列処理の処理には通常、より多くのメモリと CPU リソースが必要となるため、アプリケーションのリソース使用状況を注意深く監視する必要があります。
  • エラー処理: 同時プロセスまたは並列プロセスでのエラーの管理は難しい場合があります。各プロセスまたはスレッドで例外とエラーを適切に処理してください。
  • データベース接続: 並列タスクにデータベース クエリが含まれる場合は、各プロセス/スレッドに独自のデータベース接続があることを確認するか、競合を避けるために接続プーリングを使用してください。
  • 環境: 一部の同時実行および並列処理技術 (並列拡張、pcntl など) は、実行時間やメモリが制限されている Web サーバー (共有ホスティングなど) では機能しない可能性があります。これらのツールは通常、CLI ベースの PHP アプリケーションに適しています。

結論

PHP で

同時実行性並列性 を処理するには、PHP が複数のプロセスとスレッドでどのように動作するかを理解する必要があります。 pcntl、Parallel などの拡張機能、または ReactPHPSwoole などのライブラリを使用することで、開発者は複数のタスクを同時にまたは並行して処理できるため、I/O バウンドおよび CPU バウンドのパフォーマンスが向上します。バインドされたタスク。

適切なツールの選択は、I/O バウンドのタスク (ReactPHP または Swoole) を処理しているかどうか、または複数の CPU コアにわたるタスクを処理する必要があるかどうか (並列または pcntl を使用) など、アプリケーションの要件によって異なります。 .

以上がPHP アプリケーションでの同時実行性と並列性の処理: テクニックとツールの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート