pcntl モジュールを有効にして PHP でマルチプロセス プログラミングを実装するにはどうすればよいですか?

王林
リリース: 2023-02-23 13:14:01
転載
4442 人が閲覧しました

まずインストールした PHP のバージョンを確認してください:

PHP 7.3.7 (cli) (built: Jul 12 2019 22:25:55) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.7, Copyright (c) 1998-2018 Zend Technologies
ログイン後にコピー

php ではマルチプロセスを実装するために pcntl モジュールをインストールする必要があります。このモジュールは php によって公式に提供されているため、 PHP で使用できます ソース コードで見つかったので、php7.3.7 ソース コードをダウンロードし、/home ディレクトリに解凍します。この時点で、必要な拡張子 pcntl は /home/php-7.3.7/ にあります。 ext/pcntl

次のコマンドを順番に実行します:

phpize
./configure --with-php-config=/usr/local/bin/php-config
make & make install
ログイン後にコピー

php-config ファイルのパスを確認するには、次のようにします。 find / -name php-config を使用して、最後に ##pcntl.so ファイルを生成します。

次に、php の ini ファイルのパスを見つけ、

php --ini コマンドを使用して表示します。

php の拡​​張モジュールのパスについては、## を使用できます。 #php -i | grep extension_dir

確認し、生成された so ファイルをモジュール パスにコピーし、extension=pcntl を php.ini ファイルに追加します Use php -m toモジュールがロードされているかどうかを確認してください。この時点で、pcntl モジュールがインストールされています。コーディングを始めましょう。

for ($i = 0; $i < 3; $i++){   
    $pid = pcntl_fork();
     if ($pid == -1) {
        die("开启进程失败");
    } elseif ($pid) { 
         echo "启动子进程 $pid \n";
    } else {
      echo "子进程 ".getmypid()." 正在处理任务\n";
      sleep(rand(5,10));
      exit;
    }
}

while (pcntl_waitpid(0, $status) != -1) {
    $status = pcntl_wexitstatus($status);    
    echo "子进程推出,状态码 $status \n";
}
ログイン後にコピー

pcntl_fork()

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

pcntl_waitpid()

— fork の子プロセスのステータスを待つか返し、パラメータ pid で指定されたプロセス番号を持つプロセスが終了するまで現在のプロセスの実行を一時停止します。シグナルを受信して​​現在のプロセスを中断します。シグナル処理関数を処理または呼び出します。戻り値は -1、0、または >0 です。-1 の場合は、子プロセスにエラーがあることを意味します。>0 の場合、子プロセスが終了したことを意味し、値は終了したプロセスの PID です。子プロセスを終了する方法としては、$status ステータス コード応答を渡すことができます<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:sql;toolbar:false">root@4226aaf8d937:/home/demo# php index.php 启动子进程 150 启动子进程 151 启动子进程 152 子进程 152 正在处理任务 子进程 151 正在处理任务 子进程 150 正在处理任务 子进程推出,状态码 0 子进程推出,状态码 0 子进程推出,状态码 0</pre><div class="contentsignin">ログイン後にコピー</div></div><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:sql;toolbar:false">root@4226aaf8d937:/# ps -aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.3 3976 3180 pts/0 Ss 04:42 0:00 bash root 17 0.0 0.3 3868 3184 pts/1 Ss 04:48 0:00 bash root 149 0.3 2.1 79740 21888 pts/0 S+ 06:18 0:00 php index.php root 150 0.0 0.6 79740 6664 pts/0 S+ 06:18 0:00 php index.php root 151 0.0 0.6 79740 6604 pts/0 S+ 06:18 0:00 php index.php root 152 0.0 0.6 79740 6604 pts/0 S+ 06:18 0:00 php index.php root 153 0.0 0.2 7640 2660 pts/1 R+ 06:18 0:00 ps -aux</pre><div class="contentsignin">ログイン後にコピー</div></div>

kill -9 プロセス ID を使用して子プロセスが強制終了された場合の対処方法を教えてください。

<?php
$pid_arr = [];
for ($i = 0; $i < 3; $i++){   
    $pid = pcntl_fork();
     if ($pid == -1) {
        die("开启进程失败");
    } elseif ($pid) { 
         echo "启动子进程 $pid \n";
         array_push($pid_arr, $pid);
    } else {
      echo "子进程 ".getmypid()." 正在处理任务\n";
      sleep(rand(5,10));
      exit;
    }
}

for ($i=0; $i < count($pid_arr); $i++) {
    while (pcntl_waitpid($pid_arr[$i], $status) != -1) {
        if(!pcntl_wifexited($status)){
            //进程非正常退出
            if(pcntl_wifsignaled($status)){
                $signal = pcntl_wtermsig($status);
                //不是通过接受信号中断
                echo "子进程 $pid_arr[$i] 属于非正常停止,接收到信号 $signal \n";
            }else{
                print_r("子进程 $pid_arr[$i] 完成任务并退出 \n");
            }

        }else{
            //获取进程终端的退出状态码;
            $code = pcntl_wexitstatus($status);
            print_r("子进程 $pid_arr[$i] 正常结束任务并退出,状态码 $status \n ");
        }
    }
}
ログイン後にコピー
pcntl_wifexited

— ステータス コードが正常終了を表すかどうかを確認します。

pcntl_wifsignaled

#— 子プロセスのステータス コードが正常終了を表すかどうかを確認します。通常終了 シグナルによる中断#pcntl_wtermsig

—子プロセスの中断を引き起こしたシグナルを返します

2 つのウィンドウのうちの 1 つを開きます:


pcntl モジュールを有効にして PHP でマルチプロセス プログラミングを実装するにはどうすればよいですか?

詳細については、PHP 中国語 Web サイトをご覧ください: pcntl モジュールを有効にして PHP でマルチプロセス プログラミングを実装するにはどうすればよいですか?PHP ビデオ チュートリアル

以上がpcntl モジュールを有効にして PHP でマルチプロセス プログラミングを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:cnblogs.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!