php でマルチプロセスを実装する方法: pcntl および posix 拡張機能を使用します。必要に応じて、pcntl_fork() 関数を使用して子プロセスを作成し、pcntl_wait() 関数を使用して現在のプロセスをブロックできます。
#php マルチプロセスには、pcntl、posix 拡張機能のサポートが必要です。
マルチプロセスの実装は cli モードでのみ実行できます。Web サーバー環境では、予期しない結果が発生する可能性があります。
(推奨ビデオ チュートリアル: php ビデオ チュートリアル)
マルチプロセス コア関数:
pcntl_fork (子プロセスの作成)、pcntl_wait ( 現在のプロセスをブロックする)
詳細な紹介:
pcntl_fork:
呼び出しが 2 回返され、子プロセスの pid が親プロセスで返され、子プロセスで 0 が返され、エラーの場合は -1 が返されます。
pcntl_wait ( int &$status [, int $options ] ):
子プロセスが終了するか、現在のプロセスを終了するシグナルを受信するまで、現在のプロセスをブロックします。これは現在のプロセスを終了するシグナルであり、終了するために子プロセスによって送信される SIGCHLD は、数えた。 $status を使用して子プロセスのステータス コードを返し、2 番目のパラメータを指定してブロック状態で呼び出されるかどうかを指定できます。
関数の戻り値は子プロセスの pid です。子プロセスが存在しない場合、戻り値は -1 です;
ノンブロッキング モードで呼び出された関数は、子プロセスが実行中であるが終了していない場合に 0 を返すこともあります。
pcntl_waitpid ( int $pid , int &$status [, int $options ] )
この関数は pcntl_wait と同じですが、waitpid が指定された pid を待機する子プロセスである点が異なります。 pid が -1 の場合、pcntl_waitpid は pcntl_wait と同じになります。子プロセスのステータス情報は、pcntl_wait 関数と pcntl_waitpid 関数の $status に格納されます。
(推奨される関連チュートリアル: php グラフィック チュートリアル)
例:
一定数の子プロセスが常に
## で実行されます。 #php. 必要に応じて、pcntl_fork (子プロセスの作成)、pcntl_wait (現在のプロセスのブロック) などのコア関数を使用します。 コードの実装: ###<?php //最大的子进程数量 $maxChildPro = 8; //当前的子进程数量 $curChildPro = 0; //当子进程退出时,会触发该函数,当前子进程数-1 function sig_handler($sig) { global $curChildPro; switch ($sig) { case SIGCHLD: echo 'SIGCHLD', PHP_EOL; $curChildPro--; break; } } //配合pcntl_signal使用,简单的说,是为了让系统产生时间云,让信号捕捉函数能够捕捉到信号量 declare(ticks = 1); //注册子进程退出时调用的函数。SIGCHLD:在一个进程终止或者停止时,将SIGCHLD信号发送给其父进程。 pcntl_signal(SIGCHLD, "sig_handler"); while (true) { $curChildPro++; $pid = pcntl_fork(); if ($pid) { //父进程运行代码,达到上限时父进程阻塞等待任一子进程退出后while循环继续 if ($curChildPro >= $maxChildPro) { pcntl_wait($status); } } else { //子进程运行代码 $s = rand(2, 6); sleep($s); echo "child sleep $s second quit", PHP_EOL; exit; } }
以上がPHPでマルチプロセスを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。