PHPでのマルチプロセス使用、プロセス通信、プロセス信号などの詳細

3375 ワード

マルチプロセス環境要件
  • Linuxシステム
  • php-cliモード
  • pcntl拡張またはswoole拡張
  • pcntl拡張
     0) {
        echo "     ,    pid {$pid}" . PHP_EOL;
    } elseif($pid == 0) {
        echo "     ,  pid ". getmypid() . PHP_EOL;
    }else{
        echo "     ,       " . PHP_EOL;
    }
    

    swoole拡張
    start();
    echo $str;
    if($pid > 0){
        $status = Process::wait(true);
        echo "     ,    pid {$pid}" . PHP_EOL;
    }else{
        echo "     ,       " . PHP_EOL;
    }
    

    プロセスつうしん
    通常、各プロセス間のメモリ領域は互いに独立しており、相互にアクセスできません.
    PHPマルチプロセスでpcntl_forkから出てきたサブプロセスは、親プロセスのコンテキストコンテンツをコピーしただけで、同じメモリ領域を共有しているわけではなく、マルチプロセス間で直接通信できません.
    プロセス間通信のいくつかの方法:
  • パイプ通信:有名なパイプ、無名のパイプなどに分けられる.
  • メッセージキュー通信:linuxのメッセージキューを使用するにはsysvmsg拡張が必要です.
  • プロセス信号通信;
  • 共有メモリ通信:他のプロセスによってアクセスできるメモリをマッピングします.この共有メモリは1つのプロセスによって作成されますが、複数のプロセスにアクセスできます.
  • ソケット通信;
  • サードパーティ通信:ファイル、mysql、redisなどの方法で通信を実現します.

  • プロセスしんごう
    プロセスしんごう(Signals)はUnixシステムで使用されている最古のプロセス間通信方法の一つである.オペレーティングシステムは、プロセスシステムにおいて予め定められたイベントが発生したことを信号によって通知し、ユーザプロセス間の通信と同期の原始的なメカニズムでもある.キーボードが中断されたり、エラー条件が発生したりする可能性がある.Shellも信号を使用してサブプロセスに向かうジョブ制御信号を送信します.
    1つの信号のライフサイクルには、生成と伝送の2つの段階があります.イベントが発生すると、プロセスに通知する必要があり、信号が生成されます.プロセスが信号の到来を認識すると、適切な動作を取って信号を送信または処理する.信号到来とプロセスが信号を処理する間、信号はプロセス上で停止する.
    主な信号源は以下の通りである.
  • 異常:プロセス実行中に異常が発生した;
  • 他のプロセス:あるプロセスは、別のプロセスまたは一連のプロセスに信号を送信することができる.
  • 端末中断:Ctrl-C、Ctrl-など;
  • 作業制御:フロント、バックグラウンドプロセスの管理;
  • 割当額:CPUタイムアウト或いはファイルサイズが制限を突破する;
  • 通知:I/O準備など、プロセスのイベントの発生を通知します.
  • アラーム:タイマーが期限切れです.

  • 一般的な信号
  • SIGHUP:端末からの終了信号;
  • SIGINT:キーボードからの割り込み信号(Ctrl-C);
  • SIGQUIT:キーボードからの脱退信号(Ctrl-);
  • SIGFPE:浮動小数点異常信号(例えば浮動小数点演算オーバーフロー);
  • SIGKILL:この信号を受信するプロセスを終了する;
  • SIGALRM:プロセスのタイマが期限切れになったときに、この信号を送信します.
  • SIGTERM:killコマンドからの信号;
  • SIGCHLD:サブプロセスの停止または実行終了を識別する信号;

  • 信号デフォルト動作
  • 異常終了(abort):プロセスの現在のディレクトリの下で、プロセスのアドレス空間コンテンツ、レジスタコンテンツをcoreというファイルに保存し、プロセスを終了します.
  • 終了(exit):coreファイルを生成せず、プロセスを直接終了します.
  • 無視(ignore):信号を無視します.
  • 停止(stop):プロセスを停止します.
  • 続行(continue):プロセスが停止した場合、プロセスの実行を再開します.そうでない場合、信号は無視されます.
  • プロセスが信号に対して取ることができる操作
  • 信号を無視:プロセスは生成された信号を無視することができるが、SIGKILLとSIGSTOP信号は無視することができず、処理しなければならない(プロセス自体またはカーネルによって処理される).プロセスはシステムによって生成されたほとんどの信号を無視することができる.
  • ブロッキング信号:プロセスは、いくつかの信号をブロッキングすることを選択することができ、すなわち、到来したいくつかの信号を先に記録し、後で(ブロッキングを解除した後)処理する.
  • は、プロセスによって処理される.プロセス自体は、システムに処理信号の処理プログラムアドレスを登録することができ、この信号が発行されると、登録された処理プログラムによって信号を処理する.
  • はカーネルによってデフォルト処理される:信号はカーネルのデフォルト処理プログラムによって処理され、この信号のデフォルト動作を実行する.例えば、プロセスがSIGFPE(浮動小数点異常)を受信するデフォルトの動作はcoreを生成して終了することである.多くの場合、信号はカーネルによって処理される.
  • 信号には固有の優先度はありません.1つのプロセスに対して2つの信号が同時に生成されると、この2つの信号は任意の順序でプロセスに現れ、任意の順序で処理されます.また、同じ種類の複数の信号を区別する機構もない.プロセスが信号を処理する前に同じ信号が送信された場合、プロセスは1つの信号しか受信できません.プロセスは、1つまたは複数のSIGCONT信号を受信したか分からない.