PHP の同時実行性と並列性

WBOY
WBOYオリジナル
2024-07-17 08:08:58465ブラウズ

Concurrency and Parallelism in PHP

同時実行性と並列処理は、最新のプログラミングにおいて不可欠な概念であり、アプリケーションがインターリーブ実行 (同時実行) または同時実行 (並列処理) を通じて複数のタスクを同時に実行できるようにします。主に同期実行モデルで知られる PHP は、さまざまな技術を通じてこれらのパラダイムをサポートするように進化してきました。

PHPの標準実行モデル

PHP は伝統的に同期実行モデルに従い、特に一般的な Web サーバー設定で Apache と一緒に使用する場合はそうです。このモデルでは、各 HTTP リクエストは単一の PHP プロセスによって処理されます。リクエストの処理には次の手順が含まれます:

  1. Apache は HTTP リクエストを受信し、それを PHP に転送します。
  2. PHP は、単一スレッドで最初から最後までスクリプトを実行します。
  3. PHP は出力を Apache に返し、Apache は応答をクライアントに送り返します。

このモデルはシンプルさと理解しやすさを保証しますが、並列実行が必要なタスクや複数のタスクを同時に処理する場合は非効率になる可能性があります。

PHP における同時実行性と並列性の進化

Web アプリケーションがより複雑になるにつれて、PHP での同時実行および並列実行の必要性が高まりました。これらのパラダイムを実現するために PHP が提供する手法を見てみましょう。

1. 同期コード

同期コードは、タスクが次々に実行される最も単純な実行形式です。

echo "Synchronous Code Example:\n";
function synchronousFunction() {
    for ($i = 0; $i < 3; $i++) {
        echo "Synchronous Loop Iteration: $i\n";
        sleep(1);
    }
}
synchronousFunction();

この例では、ループの各反復が順番に実行され、反復間に 1 秒の遅延が生じます。このアプローチは単純ですが、並列実行の恩恵を受ける可能性がある I/O バウンドまたは CPU 集中型のタスクにとっては非効率的です。

2. プロセスのフォーク

フォークすると、元のプロセス (親) と同時に実行される新しいプロセス (子) が作成されます。これはタスクを並列化する場合に便利です。

echo "\nForking Process Example:\n";
function forkProcess() {
    $pid = pcntl_fork();
    if ($pid == -1) {
        die('could not fork');
    } else if ($pid) {
        echo "Parent Process: PID $pid\n";
        pcntl_wait($status); // Protect against Zombie children
    } else {
        echo "Child Process: Hello from the child process!\n";
        exit(0);
    }
}
forkProcess();

このコードでは、pcntl_fork() が子プロセスを作成します。親プロセスと子プロセスは同時に実行され、タスクの並列実行が可能になります。親プロセスは、ゾンビ プロセスの作成を避けるために、子プロセスが終了するのを待ちます。

3. ねじ切り

PHP のスレッド機能は、pthread などの拡張機能を通じて利用できます。スレッドはプロセスよりも軽量で、同じメモリ空間を共有するため、共有データを必要とするタスクに適しています。

if (!class_exists('Thread')) {
    die("Threads are not supported in this PHP build\n");
}

echo "\nThreading Example:\n";
class MyThread extends Thread {
    public function run() {
        for ($i = 0; $i < 3; $i++) {
            echo "Thread Loop Iteration: $i\n";
            sleep(1);
        }
    }
}

$thread = new MyThread();
$thread->start();
$thread->join();

この例では、Thread を拡張する MyThread クラスを定義します。 run メソッドは新しいスレッドで実行され、メインスレッドと同時に実行されます。このアプローチは、スレッドがリソースの待機を処理できる I/O バウンド操作に役立ちます。

4. 発電機

ジェネレーターは、単純なコルーチンを実装する方法を提供し、プログラム全体をブロックすることなく関数が繰り返し結果を生成できるようにします。

echo "\nGenerators Example:\n";
function simpleGenerator() {
    yield 'First';
    yield 'Second';
    yield 'Third';
}

$gen = simpleGenerator();
foreach ($gen as $value) {
    echo "Generator Yielded: $value\n";
}

ジェネレーターは、yield キーワードを使用して一度に 1 つずつ値を生成し、関数の一時停止と再開を可能にし、協調的なマルチタスクの形式を促進します。

PHP は、同期のルーツからさまざまな形式の並行性と並列性をサポートするまで長い道のりを歩んできました。同期コードは多くのユースケースにとって依然としてシンプルで効果的ですが、プロセスのフォーク、スレッド化、ジェネレーターの使用などの手法により、複雑な並列化可能なタスクを効率的に処理するための新たな可能性が開かれます。

以上がPHP の同時実行性と並列性の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。