ホームページ  >  記事  >  バックエンド開発  >  PHP 初心者ガイド: マルチスレッド プログラミング

PHP 初心者ガイド: マルチスレッド プログラミング

WBOY
WBOYオリジナル
2023-05-20 12:51:06976ブラウズ

PHP は、Web アプリケーションや動的 Web サイトの作成に使用される人気のあるサーバー側プログラミング言語です。 PHP はマルチスレッド プログラミングをネイティブにサポートしていませんが、ノンブロッキング I/O 操作とプロセス間通信を実装するために使用できるツールと拡張機能を提供します。この記事では、PHPマルチスレッドプログラミングの基礎知識とツールを紹介します。

  1. マルチスレッド プログラミングの基本

マルチスレッド プログラミングは、プログラムで複数のタスクを同時に実行できる同時プログラミング方法です。スレッドは、オペレーティング システムがリソースを割り当てる最小単位であり、独立したコード実行パスとスタック (ストレージ関数呼び出しとローカル変数) を持ちます。メモリやファイル記述子などのリソースはスレッド間で共有できるため、競合状態を避けるためにロックや条件変数などの同期ツールを使用する必要があります。

PHP でスレッドを作成するには、PCNTL 拡張機能によって提供される関数を使用する必要があります。 PCNTL は、PHP プロセス制御用のインターフェイスを提供する PHP の拡張機能です。 PCNTL 拡張機能を使用すると、サブプロセスの作成と管理、シグナルの送受信、プロセス終了イベントの処理などを行うことができます。

    #PCNTL 拡張機能
PHP PCNTL 拡張機能には、マルチスレッド プログラミングに使用できるいくつかの関数が用意されています。一般的な関数のいくつかを次に示します:

pcntl_fork(): 子プロセスを作成し、現在のプロセスのすべてのリソース (コードとデータを含む) をコピーします。子プロセスと親プロセスの唯一の違いは、プロセス ID が異なることです。親プロセスは、この ID を使用して子プロセスを監視および制御できます。

pcntl_wait($status): 子プロセスが終了し、その終了ステータスを取得するまで待機します。この関数は、子プロセスが終了するまで現在のプロセスの実行をブロックします。

pcntl_signal($sig, $handler): シグナル ハンドラーを登録し、指定されたシグナルを受信したときに指定された処理関数を呼び出します。この関数を使用すると、子プロセスの終了、割り込み、その他のイベントをキャプチャして処理できます。

pcntl_alarm($秒): タイマー シグナルをインストールし、指定された秒数の後に SIGALARM シグナルを送信します。この機能を使用すると、プロセスのステータスやファイル更新イベントを確認するためのポーリングなど、いくつかのタスクを定期的に実行できます。

    プロセス間通信
マルチスレッド プログラミングでは、プロセス間通信 (IPC) が不可欠です。 PHP は、次のようなさまざまな IPC メソッドを提供します。

(1) パイプ (パイプ): 2 つの関連するプロセス間でデータを交換できます。一方のプロセスはデータを書き込み、もう一方のプロセスはデータを読み取ります。

(2) メッセージキュー: プロセス間でデータを転送するための仕組み。プロセスは、非同期通信を実装するメッセージ キューを介してメッセージを送受信できます。

(3) 共有メモリ: 複数のプロセスが同じ共有メモリ領域にアクセスして、ステータスやデータを共有できます。

(4) セマフォ: 競合状態を防ぐため、複数のプロセス間の同期と相互排他に使用されます。

    PHP でのマルチスレッド プログラミングの実装
PHP でマルチスレッド プログラミングを実装するには、PCNTL 拡張機能と関連する IPC ツールを使用する必要があります。以下は、単純な PHP マルチスレッド プログラミングの例です。

<?php

$pid = pcntl_fork();

if ($pid == -1) {
    die('could not fork');
} else if ($pid) {
    // 父进程
    pcntl_wait($status); // 等待子进程退出
} else {
    // 子进程
    echo "child process
";
    sleep(5);
    exit(0); // 退出子进程
}

echo "parent process
";

この例では、子プロセスを作成し、子プロセスにメッセージを出力します。親プロセスは、子プロセスが終了するのを待ってから終了します。実際のアプリケーションでは、IPC ツールを使用してプロセス間通信と同期を実装できます。たとえば、メッセージ キューを使用して、親プロセスと子プロセスの間でメッセージの受け渡しを実装します。

<?php

$parent_pid = getmypid(); // 获取父进程ID
$msg_queue = msg_get_queue(123); // 创建消息队列

$pid = pcntl_fork();

if ($pid == -1) {
    die('could not fork');
} else if ($pid) {
    // 父进程
    sleep(1); // 等待子进程创建消息队列
    msg_send($msg_queue, $parent_pid, "Hello, child process!"); // 发送消息
    echo "message sent
";
    pcntl_wait($status); // 等待子进程退出
} else {
    // 子进程
    $child_pid = getmypid(); // 获取子进程ID
    echo "child process
";
    $msg = null;
    msg_receive($msg_queue, $child_pid, $msgtype, 1024, $msg); // 接收消息
    echo "received message: $msg
";
    exit(0); // 退出子进程
}

echo "parent process
";

この例では、メッセージ キューを作成し、親プロセスと子プロセスの間で文字列メッセージを渡します。親プロセスは、子プロセスが終了するのを待ってから終了します。この例では、メッセージが他のプロセスによって受信されないように、メッセージ タイプとしてプロセス ID を使用する必要があることに注意してください。

    概要
PHP 自体はマルチスレッドをサポートしていませんが、PCNTL 拡張機能と関連する IPC ツールを使用することで、マルチスレッド プログラミング、同時実行制御、および IPC を実現できます。通信などの機能。マルチスレッド プログラミングによりプログラムのパフォーマンスと応答性が向上しますが、競合状態やデッドロックなどの問題を回避するように注意する必要があります。実際のアプリケーションでは、特定のシナリオに応じて適切なツールとテクノロジーを選択する必要があります。

以上がPHP 初心者ガイド: マルチスレッド プログラミングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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