「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > PHP の同時実行性と並列性

PHP の同時実行性と並列性

2024 年 7 月 31 日に公開
ブラウズ:397

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 



この例では、ループの各反復が順番に実行され、反復間に 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 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 は、その同期のルーツから長い道のりを経て、さまざまな形式の並行性と並列性をサポートしてきました。同期コードは多くのユースケースにとって依然としてシンプルで効果的ですが、プロセスのフォーク、スレッド化、ジェネレーターの使用などの手法により、複雑で並列化可能なタスクを効率的に処理するための新たな可能性が開かれます。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/francescoagati/concurrency-and-Parallelism-in-php-6fc?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3