PHP は、Web アプリケーションや動的 Web サイトの作成に使用される人気のあるサーバー側プログラミング言語です。 PHP はマルチスレッド プログラミングをネイティブにサポートしていませんが、ノンブロッキング I/O 操作とプロセス間通信を実装するために使用できるツールと拡張機能を提供します。この記事では、PHPマルチスレッドプログラミングの基礎知識とツールを紹介します。
マルチスレッド プログラミングは、プログラムで複数のタスクを同時に実行できる同時プログラミング方法です。スレッドは、オペレーティング システムがリソースを割り当てる最小単位であり、独立したコード実行パスとスタック (ストレージ関数呼び出しとローカル変数) を持ちます。メモリやファイル記述子などのリソースはスレッド間で共有できるため、競合状態を避けるためにロックや条件変数などの同期ツールを使用する必要があります。
PHP でスレッドを作成するには、PCNTL 拡張機能によって提供される関数を使用する必要があります。 PCNTL は、PHP プロセス制御用のインターフェイスを提供する PHP の拡張機能です。 PCNTL 拡張機能を使用すると、サブプロセスの作成と管理、シグナルの送受信、プロセス終了イベントの処理などを行うことができます。
pcntl_fork(): 子プロセスを作成し、現在のプロセスのすべてのリソース (コードとデータを含む) をコピーします。子プロセスと親プロセスの唯一の違いは、プロセス ID が異なることです。親プロセスは、この ID を使用して子プロセスを監視および制御できます。
pcntl_wait($status): 子プロセスが終了し、その終了ステータスを取得するまで待機します。この関数は、子プロセスが終了するまで現在のプロセスの実行をブロックします。
pcntl_signal($sig, $handler): シグナル ハンドラーを登録し、指定されたシグナルを受信したときに指定された処理関数を呼び出します。この関数を使用すると、子プロセスの終了、割り込み、その他のイベントをキャプチャして処理できます。
pcntl_alarm($秒): タイマー シグナルをインストールし、指定された秒数の後に SIGALARM シグナルを送信します。この機能を使用すると、プロセスのステータスやファイル更新イベントを確認するためのポーリングなど、いくつかのタスクを定期的に実行できます。
<?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 初心者ガイド: マルチスレッド プログラミングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。