PHPのpcntlプロセス制御チュートリアル1(pcntl_fork)


pcntlの概要
PHPのプロセス制御サポートはUnix方式のプロセス作成、プログラム実行、信号処理及びプロセスの中断を実現した.プロセス制御をWebサーバ環境に適用することはできません.Webサービス環境で使用すると、予期せぬ結果をもたらす可能性があります.
このドキュメントは、各プロセス制御関数の一般的な使用方法を説明するために使用されます.Unixプロセス制御の詳細については、fork(2)、waitpid(2)、signal(2)などのシステムドキュメントの一部またはより包括的な参考資料、例えば「Unix環境高度プログラミング」(著者:W.Richard Stevens、Addison-Wesley出版)を参照することをお勧めします.
PCNTLは現在,信号処理のコールバック機構としてticksを用いており,ticksは従来の処理機構をはるかに上回っている.この変化は「ユーザticks」と同じ意味に従う.declare()文を使用して、コールバックを許可する場所をプログラムで指定できます.これにより、非同期イベント処理のオーバーヘッドを最小限に抑えることができます.PHPをコンパイルするときにpcntlを有効にすると、スクリプトでpcntlが本当に使用されているかどうかにかかわらず、常にこのオーバーヘッドが発生します.
一つの調整はPHP 4.3である.0以前のすべてのpcntlスクリプトを動作させるには、コールバックを許可する(コード)セクションでdeclare()を使用するか、declare()の新しいグローバル構文を使用してスクリプト全体で有効にします.
Note:この拡張はWindowsプラットフォームでは使用できません.
公式ドキュメント
pcntl公式ドキュメント
pcntl_fork
#     

PHP 4 >= 4.1.0, PHP 5, PHP 7)

pcntl_fork —              (   )。  :fork         ,          fork           ,            ,   fork         ,        0。

  
int pcntl_fork ( void )
pcntl_fork()         ,      PID(   )  PPID(    )       。fork                       fork(2)  。

   
   ,                  PID,           0。   ,          -1,       ,       PHP  。

コード#コード#

"; if (strtolower(php_sapi_name()) != 'cli') { die(" cli "); } echo " :" . getmypid() . NEWLINE; $pid = pcntl_fork(); //fork //fork , , , if ($pid == -1) { // , -1 die(' fork '); } else if ($pid) { // $pid ?> 0, fork , id // $time = microtime(true); echo " :{$time}".NEWLINE; } else { // $pid = 0 // $time = microtime(true); echo " :{$time}".NEWLINE; }

実行結果
    :17472

     :1528697500.2961

     :1528697500.2961

fork後にサブプロセスが先に実行されますか?それとも親プロセスが先に論理を実行しますか?
テストコード
ここでは、上記のコードの親子プロセスのif順序を変更します.
if ($pid == -1) { //     ,  -1

    die('  fork  ');

} else if (!$pid) { // $pid = 0

    //      
    $time = microtime(true);
    echo "     :{$time}".NEWLINE;
} else if ($pid) { // $pid > 0,   fork  ,     id

    //      
    $time = microtime(true);
    echo "     :{$time}".NEWLINE;

}

実行結果
    :17472

     :1528697500.2961

     :1528697500.2961

テストの概要
forkはまず親プロセスロジックを実行し、サブプロセスロジックを実行します.