ホームページ  >  記事  >  バックエンド開発  >  PHPマルチプロセスプログラミングの分析

PHPマルチプロセスプログラミングの分析

藏色散人
藏色散人転載
2021-04-15 09:12:182697ブラウズ

推奨: 「PHP ビデオ チュートリアル

PHP マルチプロセス プログラミング

複数のプロセスを使用する利点:

    1. 使用多进程, 子进程结束以后, 内核会负责回收资源
    2. 使用多进程,子进程异常退出不会导致整个进程Thread退出. 父进程还有机会重建流程.
    3. 一个常驻主进程, 只负责任务分发, 逻辑更清楚.

PHP でマルチプロセスを実装するには、Let's Go.

pcnt 拡張機能をインストールする必要があります

pcntl はプロセス制御の略で、通常、PHP はこの拡張機能をデフォルトでインストールします。 phpinfo() 関数を使用して、拡張機能が存在するかどうかを確認します。

PHPマルチプロセスプログラミングの分析

pcntl_fork() 関数を使用して子プロセスを作成する

pcntl_fork の機能は、現在のプロセスと同じ子プロセスを作成することです。 . この子プロセスのコード セグメントは現在のプロセスとまったく同じですが、独自のデータ セグメントを持っています。子プロセスを作成する最も簡単な方法を見てみましょう:

<?php /**
 *  hedong
 * @date 2017-04-03
 */

$parentPid = getmypid(); // 获取父进程id $childPid = pcntl_fork(); // 创建子进程 switch($childPid) {
    case -1:
        print "创建子进程失败!".PHP_EOL;
        exit;
    case 0:
        print "我是子进程,进程ID:{$childPid}".PHP_EOL;
        break;
    default:
        print "我是父进程,进程ID:{$parentPid},子进程ID: {$childPid}".PHP_EOL;
}
?>
pcntl_fork()调用成功以后,一个程序变成了两个程序:一个程序得到的$pid变量值是0,它是子进程;另一个程序得到的$pid的值大于0,这个值是子进程的PID,它是父进程。

出力結果:

PHPマルチプロセスプログラミングの分析

サブプロセスのリサイクル

① ブロック方法## #今何かPSを受け取りましたか?通常、私は ps aux plus grep コマンドを使用して実行中のバックグラウンド プロセスを見つけることに慣れています。 STAT 列があり、各プロセスの実行ステータスを識別します。ここでは、状態 Z: ゾンビに焦点を当てます。子プロセスが親プロセスより先に終了し、親プロセスがそれに対して何も行わない場合、子プロセスはゾンビ プロセスになります。ゾンビ プロセスは多くのメモリを占有しませんが、目障りです。 (それらがまだ PID を占有していることを忘れないでください)

一般に、親プロセスが終了する前に、ハングした子プロセスをリサイクルするだけです。 pcntlの拡張機能にはpcntl_wait()という関数があり、プロセスの終了を待って終了したプロセスを再利用するメソッドです。

<?php /**
 *  hedong
 * @date 2017-04-03
 */

$parentPid = getmypid(); // 获取父进程id $childPid = pcntl_fork(); // 创建子进程 switch($childPid) {
    case -1:
        print "创建子进程失败!".PHP_EOL;
        exit;
    case 0:
        print "我是子进程,进程ID:{$childPid}".PHP_EOL;
        break;
    default:
        pcntl_wait($status); // 子进程执行完后才执行父进程         print "我是父进程,进程ID:{$parentPid},子进程ID: {$childPid}".PHP_EOL;
}
② ノンブロッキング方式

ブロッキング方式では複数プロセスの並列性が失われます。完成した子プロセスを再利用して並列化する方法もあります。これはブロックしない方法です。

<?php /**
 *  hedong
 * @date 2017-04-03
 */

for ($i = 1; $i <= 5; ++$i) {
    $pid = pcntl_fork(); // 创建子进程

    if (!$pid) {
        sleep(1);
        print "In child $i\n";
        exit($i);
    }
}

// pcntl_waitpid 第一个参数为 0 代表处理全部子进程

while (pcntl_waitpid(0, $status) != -1) {
    $status = pcntl_wexitstatus($status);
    echo "Child $status completed\n";
}
親プロセスが先にハングしたらどうなるでしょうか? ######何が起こるのですか?何も起こりません。子プロセスはまだ実行中です。ただしこのとき、子プロセスはプロセス 1 に引き継がれ、プロセス 1 はこれらの子プロセスの継父になります。プロセス No. 1 はこれらのプロセスのリソースを適切に管理し、プロセスが終了すると自動的にリソースを再利用します。したがって、ゾンビ プロセスに対処する別の一時的な方法は、親プロセスをシャットダウンすることです。

最後の注意:

プロセス制御は Web サーバー環境では適用できません。Web サービス環境で使用すると、予期しない結果が生じる可能性があります。 -- PHP マニュアルからの抜粋

参考:

http://www.hackingwithphp.com/16/1/3/getting-into-multiprocessing

http://www.jb51.net/article/71232.htm

http://www.laruence.com/2009/06/11/930.html

http://imhuchao.com/596.html

https://www.pureweber.com/article/php-multi-process-programming-preview/

以上がPHPマルチプロセスプログラミングの分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。