マルチスレッドとは、アプリケーション内で複数のスレッド (プログラム実行フロー) を同時に実行することを指し、複数のタスクを同時に実行できます。 PHP では、マルチスレッドは、ビッグ データの計算、同時アクセスなど、複数のタスクを同時に実行する必要があるシナリオで広く使用されています。この記事では、PHP におけるマルチスレッドとその実装方法について紹介します。
1. PHP マルチスレッドの実装原理
PHP マルチスレッドの実装方法を真に理解する前に、プロセスとスレッドの関係という理解する必要がある概念があります。 。プロセスとは、実行中のプログラム インスタンスを指します。各プロセスは独自のメモリ空間とリソースを持ち、プロセスは互いに独立しています。スレッドはプロセス内の実行可能な単位であり、プロセスには複数のスレッドを含めることができ、プロセスのリソースを共有できます。マルチプロセスに対するマルチスレッドの利点は、スレッド間の切り替えがプロセス間の切り替えよりも速く、リソースのオーバーヘッドが小さいことです。同時アクセスなど、複数のタスクを同時に実行する必要があるシナリオに適しています。
PHP でマルチスレッドを実装するには、「PCNTL」ライブラリと呼ばれる拡張機能を使用する必要があります。この拡張機能は、プロセスとシグナル処理を制御できる一連の関数を提供し、マルチプロセスおよびマルチスレッドプログラミングを可能にします。
2. PHP でマルチスレッドを実装する方法
1. pcntl_fork() 関数を使用して子プロセスを作成します
PHP で pcntl_fork() 関数を使用して、子プロセスを作成します。現在のプロセスは 2 つのプロセスにコピーされ、1 つは親プロセス、もう 1 つは子プロセスになります。親プロセスと子プロセスは 2 つの独立したプロセスですが、一部のリソースを共有します。この機能を使用してマルチスレッドを実装できます。
#次は 5 つのサブプロセスを作成する例で、各サブプロセスは異なるタスクを実行します:<?php $workers = 5; for ($i = 0; $i < $workers; $i++) { $pid = pcntl_fork(); if ($pid === -1) { die('Could not fork'); } elseif ($pid) { // 父进程继续执行 } else { // 子进程执行任务 sleep(5); exit(0); } } // 父进程等待所有子进程结束 while (pcntl_waitpid(0, $status) != -1) { $status = pcntl_wexitstatus($status); echo "Child $status completed "; } ?>
<?php $workers = 5; $jobs = []; // 子进程任务 function doJob($job) { echo "Worker $job start "; sleep(5); echo "Worker $job completed "; } // 信号处理函数 function sig_handler($signo) { global $jobs; switch ($signo) { case SIGCHLD: // 检查所有子进程是否都已经结束 while (($pid = pcntl_waitpid(-1, $status, WNOHANG)) > 0) { $jobs--; } break; } } // 安装信号处理器 pcntl_signal(SIGCHLD, "sig_handler"); // 创建子进程 for ($i = 0; $i < $workers; $i++) { $pid = pcntl_fork(); if ($pid == -1) { die('Could not fork'); } elseif ($pid == 0) { // 子进程执行任务 doJob($i); exit(0); } else { // 父进程继续执行 $jobs++; } } // 父进程等待所有子进程结束 while ($jobs > 0) { sleep(1); } // 所有子进程都已完成任务 echo "All workers completed "; ?>
以上がPHP でのマルチスレッドとその実装方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。