ホームページ  >  記事  >  バックエンド開発  >  PHPマルチプロセス実行タスクの手順

PHPマルチプロセス実行タスクの手順

不言
不言オリジナル
2018-07-06 11:21:302289ブラウズ

この記事では、主に PHP のマルチプロセス実行タスクの手順を紹介します。一定の参考値がありますので、共有します。必要な友人は参考にしてください。

要件

はい 指定された数の複数のタスクが同時に実行され、プロセス数が制御されます。

プロセスとスレッド:

プロセスは互いに独立しており、相互に影響しません。 。

コード例:

<?php

$task = 0; //任务id
$taskNum = 10; //任务总数
$processNumLimit = 2; //子进程总量限制

while(true){
   //产生分支
   $processid = pcntl_fork();

   //创建子进程失败
   if( $processid == -1 ){
       echo "create process error!\n";
       exit(1);
   }
   //主进程,获得子进程pid
   elseif($processid){
       $task++; //下一个任务

       $currentProcessid = posix_getpid(); //当前进程的Id
       $parentProcessid = posix_getppid(); // 父级进程的ID
       $phpProcessid = getmypid(); //当前php进程的id
       echo "task:",$task,"\tprocessid:",$processid,"\tcurrentProcessid:",$currentProcessid,"\tparentProcessid:",$parentProcessid,"\tphpProcessid:",$phpProcessid,"\n";

       //控制进程数
       if($task >= $processNumLimit) {
           echo "wait chl start!\n";
           $exitid = pcntl_wait($status); //等待退出
           echo "wait chl end!extid:",$exitid,"\tstatus:",$status,"\n";
       }
       
       //任务总量控制
       if($task >= $taskNum) {
           echo "taskNum enough!\n";
           break;
       }
   }
   //processid=0为新创建的进程
   else{
       //模拟不同任务的不同执行时长
       $sleep = rand(1, 5);

       $currentProcessid = posix_getpid(); //当前进程的Id
       $parentProcessid = posix_getppid(); // 父级进程的ID
       $phpProcessid = getmypid(); //当前php进程的id
       echo "task:",$task,"\tprocessid:",$processid,"\tcurrentProcessid:",$currentProcessid,"\tparentProcessid:",$parentProcessid,"\tphpProcessid:",$phpProcessid,"\tsleep:",$sleep,"\tbegin!\n";

       sleep($sleep);

       echo "task:",$task,"\tprocessid:",$processid,"\tcurrentProcessid:",$currentProcessid,"\tparentProcessid:",$parentProcessid,"\tphpProcessid:",$phpProcessid,"\tsleep:",$sleep,"\tend!\n";
       
       exit(0); //子进程执行完后退出,防止进入循环创建子进程
   }
}

実行結果:

task:1    processid:32225    currentProcessid:32224    parentProcessid:15053    phpProcessid:32224
task:0    processid:0    currentProcessid:32225    parentProcessid:32224    phpProcessid:32225    sleep:5    begin!
task:2    processid:32226    currentProcessid:32224    parentProcessid:15053    phpProcessid:32224
wait chl start!
task:1    processid:0    currentProcessid:32226    parentProcessid:32224    phpProcessid:32226    sleep:2    begin!
task:1    processid:0    currentProcessid:32226    parentProcessid:32224    phpProcessid:32226    sleep:2    end!
wait chl end!extid:32226    status:0
task:3    processid:32228    currentProcessid:32224    parentProcessid:15053    phpProcessid:32224
wait chl start!
task:2    processid:0    currentProcessid:32228    parentProcessid:32224    phpProcessid:32228    sleep:1    begin!
task:2    processid:0    currentProcessid:32228    parentProcessid:32224    phpProcessid:32228    sleep:1    end!
wait chl end!extid:32228    status:0
task:4    processid:32229    currentProcessid:32224    parentProcessid:15053    phpProcessid:32224
wait chl start!
task:3    processid:0    currentProcessid:32229    parentProcessid:32224    phpProcessid:32229    sleep:2    begin!
task:0    processid:0    currentProcessid:32225    parentProcessid:32224    phpProcessid:32225    sleep:5    end!
wait chl end!extid:32225    status:0
task:5    processid:32270    currentProcessid:32224    parentProcessid:15053    phpProcessid:32224
wait chl start!
task:4    processid:0    currentProcessid:32270    parentProcessid:32224    phpProcessid:32270    sleep:1    begin!
task:3    processid:0    currentProcessid:32229    parentProcessid:32224    phpProcessid:32229    sleep:2    end!
wait chl end!extid:32229    status:0
task:6    processid:32271    currentProcessid:32224    parentProcessid:15053    phpProcessid:32224
wait chl start!
task:5    processid:0    currentProcessid:32271    parentProcessid:32224    phpProcessid:32271    sleep:4    begin!
task:4    processid:0    currentProcessid:32270    parentProcessid:32224    phpProcessid:32270    sleep:1    end!
wait chl end!extid:32270    status:0
task:7    processid:32273    currentProcessid:32224    parentProcessid:15053    phpProcessid:32224
wait chl start!
task:6    processid:0    currentProcessid:32273    parentProcessid:32224    phpProcessid:32273    sleep:1    begin!
task:6    processid:0    currentProcessid:32273    parentProcessid:32224    phpProcessid:32273    sleep:1    end!
wait chl end!extid:32273    status:0
task:8    processid:32274    currentProcessid:32224    parentProcessid:15053    phpProcessid:32224
wait chl start!
task:7    processid:0    currentProcessid:32274    parentProcessid:32224    phpProcessid:32274    sleep:2    begin!
task:5    processid:0    currentProcessid:32271    parentProcessid:32224    phpProcessid:32271    sleep:4    end!
task:7    processid:0    currentProcessid:32274    parentProcessid:32224    phpProcessid:32274    sleep:2    end!
wait chl end!extid:32274    status:0
task:9    processid:32277    currentProcessid:32224    parentProcessid:15053    phpProcessid:32224
wait chl start!
wait chl end!extid:32271    status:0
task:8    processid:0    currentProcessid:32277    parentProcessid:32224    phpProcessid:32277    sleep:2    begin!
task:10    processid:32278    currentProcessid:32224    parentProcessid:15053    phpProcessid:32224
wait chl start!
task:9    processid:0    currentProcessid:32278    parentProcessid:32224    phpProcessid:32278    sleep:2    begin!
task:8    processid:0    currentProcessid:32277    parentProcessid:32224    phpProcessid:32277    sleep:2    end!
task:9    processid:0    currentProcessid:32278    parentProcessid:32224    phpProcessid:32278    sleep:2    end!
wait chl end!extid:32277    status:0
taskNum enough

実行分析:

  1. pcntl_fork が子プロセスを作成した後、子プロセスは関数コードを実行し、親プロセスは引き続きタスク ID をインクリメントして次のタスク プロセスを作成します。

  2. pcntl_wait を介して子プロセスの実行が終了して終了するまで待ち、その後終了します。プロセスの総数を達成するために新しいプロセスを作成します Control;

  3. メイン プロセスの作成が完了したら、ブレークを通じてループを終了します。現時点でも実行を続けている子プロセスが存在する可能性があります。

関連関数:

pcntl_fork

現在のプロセスの現在位置に分岐 (子プロセス) を生成します。成功すると、生成された子プロセスの PID が親プロセスの実行スレッドに返され、子プロセスの実行スレッドには 0 が返されます。失敗すると、親プロセス コンテキストで -1 が返され、子プロセスは作成されず、PHP エラーが発生します。

pcntl_wait

待機するか、フォークの子プロセスのステータスを返します。 wait 関数は、子プロセスが終了するか、現在のプロセスの中断またはシグナル処理関数の呼び出しを必要とするシグナルを受信するまで、現在のプロセスの実行をスクレイピングします。この関数が呼び出されたときに子プロセスが終了していた場合 (一般にゾンビ プロセスとして知られています)、この関数はすぐに戻ります。子プロセスによって使用されていたすべてのシステム リソースが解放されます。

その他:

1. ゾンビプロセスとオーファンプロセスの問題

一部のゾンビプロセスはpcntl_waitによりステータスを取得してリソースを解放し、引き継がれていないプロセスはオーファンになります。プロセス。オーファンプロセスは、待機のステータス取得とリソース解放を完了するために init プロセスによって採用されます。

上記がこの記事の全内容です。皆様の学習に少しでもお役に立てれば幸いです。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。

関連する推奨事項:

php クイック ソート コード

Laravel5.5 がテーブル移行コマンドを実行すると、テーブルが空のように表示されます。解決策

PHP 変数のスコープ、グローバル、静的、その他のキーワード

以上がPHPマルチプロセス実行タスクの手順の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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