目次
pcntl_fork
マルチプロセスのメインプロセスがサブプロセスを作成する場合、メインプロセスはサブプロセスのステータスをどのように確認しますか? ここでのステ​​ータスには、子プロセスが強制終了されたり、ゾンビプロセスになったりすることが含まれます。 pcntl_waitpid は子プロセスのステータス コードを取得できます。このステータス コードを通じて、子プロセスがどのような状態にあるかを知ることができます。その使用法:
pcntl_wexitstatus
pcntl_wifsignaled
pcntl_wifstopped
pcntl_wtermsig

php pcntl練習ピット充填

Jun 23, 2016 pm 01:27 PM

PHP は、pcntl 拡張機能を使用してマルチプロセス プログラミングを実装できます。pcntl を使用してマルチプロセスを作成する方法に関するオンライン情報については、ここでは説明しません。主に、pcntl_fork の落とし穴と、関連するいくつかの比較的珍しい関数の使用について説明します。 、これも穴を掘って埋めることから導き出された結論です。
くだらないことは言わないで、とにかく始めてください

pcntl_fork

実際に、PHP を使用したマルチプロセスの練習用のモデルは、おおよそ次のとおりです。各子プロセスが対応するファイルを作成し、最後に親プロセスが作成できることを期待しています。親プロセスのファイルを作成します。コードは次のとおりです (落とし穴あり):

$pid_dir = __dir__."/pid_files";for($i=0; $i<3; $i++){    $pid = pcntl_fork();    if($pid == -1){        var_dump("fork failed");    }    if(!$pid){        //子进程代码        $pid = posix_getpid();        $ppid = posix_getppid();        $r = rand(0,100);  //随机数        touch("$pid_dir/fork_child_process_{$i}_{$ppid}_{$pid}_{$r}");    }} $pid = posix_getpid();$ppid = posix_getppid();$r = rand(0,100); //随机数touch("$pid_dir/fork_process_pid_{$ppid}_{$pid}_$r");
ログイン後にコピー

上記のコードでは、ループを通じて 3 つの子プロセスを作成し、各プロセスがファイルを作成し、完了後にファイルを作成します。 、親プロセスは独自のファイルを作成するため、最終的には 4 つのファイルが作成されるはずですが、これは当てはまりません:

fork_child_process_0_62656_62658_39fork_child_process_1_62656_62659_51fork_child_process_1_62658_62660_22fork_child_process_2_62656_62661_91fork_child_process_2_62658_62662_22fork_child_process_2_62659_62663_82fork_child_process_2_62660_62664_59fork_process_pid_62225_62656_48fork_process_pid_62656_62658_22fork_process_pid_62656_62659_82fork_process_pid_62656_62661_65fork_process_pid_62658_62660_59fork_process_pid_62658_62662_59fork_process_pid_62659_62663_61fork_process_pid_62660_62664_10
ログイン後にコピー

上記の結果が発生する理由は、fork 後に元のプロセスが1 つのメインプロセスと 1 つの子プロセスの 2 つのプロセスに分割されます。fork の後のコードはすべて共有されますが、fork の戻り値を使用して、対応するサブプロセスを実行するかどうかを判断できます。メインプロセスのロジックですが、サブプロセス自体は for ループ部分に進みます。サブプロセスは自分で子プロセスを作成したので、上に複数の child_process ファイルがあるのはなぜなのか、それを分析してみましょう。

======================ゴージャスな分割線======================= = ======

ループ変数 $i、$i が 0 の場合、メインプロセス a (変更なし) と子プロセス aa が生成され、子プロセス ファイル fork_child_process_0_62656_62658_39、メイン プロセスが作成されます。 a は $i=1 で循環し続け、子プロセス ab が作成され、fork_child_process_1_62656_62659_51 が作成されます。メイン プロセス a は $i=2 で循環し続け、子プロセス ac が作成されます。 fork_child_process_2_62656_62661_91 は、メイン プロセス a の pid です。

この時点で、 aa によって作成された最初のサブプロセス aa を見てみましょう。上記のサブプロセスファイルが作成された後は何も起こりません。そうしないと、引き続き for ループが実行され、メインプロセス a のループ変数、つまり の値が継承されます。 $i が 0 であるため、aa プロセスの次のループの $i は 1 となり、aa は作成を続行します。子プロセス aaa はファイル fork_child_process_1_62658_62660_22 を作成します。aa は $i=2 として子プロセス aab を作成します。この子プロセスは、fork_child_process_2_62658_62662_22 ファイルを作成します。ここで、aaa と aab の ppid が aa 62658 であることがわかります。このとき、aaa と aab も、aa の $i 値を継承するのが妥当です。 $i の値は 1 です。ループが継続すると、$i は 2 になります。これは、aaa と aab が子プロセス ファイル fork_child_process_2_62659_62663_82(aaaa)、およびそれらに対応する親を作成することを意味します。プロセスは aaa(62659) と aab(62660) です。

この時点で、for ループ内のマルチプロセス ロジックが完了しているため、最初の部分は 7 つのファイルが生成されました

======== ============== ゴージャスな分割線==================== ==========

として2 番目の部分に 8 つのファイルがある理由については、自分で考えてみてください。メイン プロセスとサブプロセスに関係なく、for ループが完了した後は処理が継続されることに注意してください。理解する。

実際のコードでは、この間違いを犯しました。

上記の問題を解決するには、子プロセスの実行の最後に終了するだけです

fork_child_process_0_63219_63221_66fork_child_process_1_63219_63222_88fork_child_process_2_63219_63223_22fork_process_pid_62225_63219_77
ログイン後にコピー

続けて、インターネットでマルチプロセスプログラミングで使用されているpcntl_waitpidをたくさん見たのですが、意味がわかりません。例は非常に少ないので、今のところ私の理解について話しましょう

pcntl_waitpid

fork の子プロセスのステータスを待つか返します。

マルチプロセスのメインプロセスがサブプロセスを作成する場合、メインプロセスはサブプロセスのステータスをどのように確認しますか? ここでのステ​​ータスには、子プロセスが強制終了されたり、ゾンビプロセスになったりすることが含まれます。 pcntl_waitpid は子プロセスのステータス コードを取得できます。このステータス コードを通じて、子プロセスがどのような状態にあるかを知ることができます。その使用法:

int pcntl_waitpid ( int $pid , int &$status [, int $options = 0 ] )
ログイン後にコピー

返される値は、-1、0、または >0 の値になります。 - 1、子プロセスにエラーがあることを示します。>0 は子プロセスが終了したことを示し、値が終了する子プロセスの PID である場合は、$status ステータス コードを使用して応答できます。 では、いつ 0 が返されるのでしょうか? オプション パラメータが WNOHANG で、子プロセスが実行中の場合、つまり、options=WNOHANG が設定されている場合、子プロセスが終了していない場合、pcntl_waitpid は 0 を返します
Inさらに、このパラメータが WNOHANG に設定されていない場合、pcntl_waitpid は子プロセスが終了するまで操作をブロックします。オプションのもう 1 つの値である WUNTRACED については、まだ理解されておらず、表現できません

それでは、どのように決定するかです。プロセスは次のように $status (ステータス コード) に基づいて終了しました (パラメーターはすべて $status です)

pcntl_wifexited この関数は、$status に基づいてプロセスが正常に終了したかどうか、正常終了とは何かを判断できます。出口

pcntl_wexitstatus

这个函数仅在pcntl_wifexited 返回True(即正常退出)时有效, 且返回子进程退出的返回状态码, 这个返回状态码可以通过exit($s)的参数($s必须为整数时)定义

pcntl_wifsignaled

检查子进程状态码是否代表由于某个信号而中断, 比如是不是我们给他发送了term, int 等信号了

pcntl_wexitstatus

假如是发送信号而导致子进程中断, 那么这个信号是什么信号呢, 这个函数就是获取这个信号的

pcntl_wifstopped

仅当option选项为WUNTRACED时有效, 未理解, 不表

pcntl_wtermsig

同上

综合实例代码:

$res = pcntl_waitpid($pid, $status, WNOHANG);//FileLog::log("pid is $pid; wait result is $res");if($res == -1 || $res > 0){    if(!pcntl_wifexited($status)){        //进程非正常退出        FileLog::log("service stop unusally; pid is $pid");    }else{        //获取进程终端的退出状态码;        $code = pcntl_wexitstatus($status);        FileLog::log("service stop code: $code;pid is $pid ");    }    if(pcntl_wifsignaled($status)){        //不是通过接受信号中断        FileLog::log("service stop not by signal;pid is $pid ");    }else{        $signal = pcntl_wtermsig($status);        FileLog::log("service stop by signal $signal;pid is $pid");    }}
ログイン後にコピー

上面的这个代码就通过根据pcntl_waitpid的返回结果和状态码对子进程因为不同原因中断做了不同的处理

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHP:Web開発の重要な言語 PHP:Web開発の重要な言語 Apr 13, 2025 am 12:08 AM

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

PHPでの安全なパスワードハッシュ(例:Password_hash、password_verify)を説明します。 MD5またはSHA1を使用してみませんか? PHPでの安全なパスワードハッシュ(例:Password_hash、password_verify)を説明します。 MD5またはSHA1を使用してみませんか? Apr 17, 2025 am 12:06 AM

PHPでは、Password_hashとpassword_verify関数を使用して安全なパスワードハッシュを実装する必要があり、MD5またはSHA1を使用しないでください。 1)password_hashセキュリティを強化するために、塩値を含むハッシュを生成します。 2)password_verifyハッシュ値を比較して、パスワードを確認し、セキュリティを確保します。 3)MD5とSHA1は脆弱であり、塩の値が不足しており、最新のパスワードセキュリティには適していません。

PHPとPython:2つの一般的なプログラミング言語を比較します PHPとPython:2つの一般的なプログラミング言語を比較します Apr 14, 2025 am 12:13 AM

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

アクション中のPHP:実際の例とアプリケーション アクション中のPHP:実際の例とアプリケーション Apr 14, 2025 am 12:19 AM

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか? スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか? Apr 17, 2025 am 12:25 AM

PHPタイプは、コードの品質と読みやすさを向上させるためのプロンプトがあります。 1)スカラータイプのヒント:php7.0であるため、基本データ型は、int、floatなどの関数パラメーターで指定できます。 3)ユニオンタイプのプロンプト:PHP8.0であるため、関数パラメーターまたは戻り値で複数のタイプを指定することができます。 4)Nullable Typeプロンプト:null値を含めることができ、null値を返す可能性のある機能を処理できます。

PHPの永続的な関連性:それはまだ生きていますか? PHPの永続的な関連性:それはまだ生きていますか? Apr 14, 2025 am 12:12 AM

PHPは依然として動的であり、現代のプログラミングの分野で重要な位置を占めています。 1)PHPのシンプルさと強力なコミュニティサポートにより、Web開発で広く使用されています。 2)その柔軟性と安定性により、Webフォーム、データベース操作、ファイル処理の処理において顕著になります。 3)PHPは、初心者や経験豊富な開発者に適した、常に進化し、最適化しています。

PHPおよびPython:さまざまなパラダイムが説明されています PHPおよびPython:さまざまなパラダイムが説明されています Apr 18, 2025 am 12:26 AM

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHP対その他の言語:比較 PHP対その他の言語:比較 Apr 13, 2025 am 12:19 AM

PHPは、特に迅速な開発や動的なコンテンツの処理に適していますが、データサイエンスとエンタープライズレベルのアプリケーションには良くありません。 Pythonと比較して、PHPはWeb開発においてより多くの利点がありますが、データサイエンスの分野ではPythonほど良くありません。 Javaと比較して、PHPはエンタープライズレベルのアプリケーションでより悪化しますが、Web開発により柔軟性があります。 JavaScriptと比較して、PHPはバックエンド開発により簡潔ですが、フロントエンド開発のJavaScriptほど良くありません。

See all articles