まずインストールした 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 コマンドを使用して表示します。
確認し、生成された 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 エラーが発生します。
— fork の子プロセスのステータスを待つか返し、パラメータ pid で指定されたプロセス番号を持つプロセスが終了するまで現在のプロセスの実行を一時停止します。シグナルを受信して現在のプロセスを中断します。シグナル処理関数を処理または呼び出します。戻り値は -1、0、または >0 です。-1 の場合は、子プロセスにエラーがあることを意味します。>0 の場合、子プロセスが終了したことを意味し、値は終了したプロセスの PID です。子プロセスを終了する方法としては、$status ステータス コード応答を渡すことができます<pre class="brush:sql;toolbar:false">root@4226aaf8d937:/home/demo# php index.php
启动子进程 150
启动子进程 151
启动子进程 152
子进程 152 正在处理任务
子进程 151 正在处理任务
子进程 150 正在处理任务
子进程推出,状态码 0
子进程推出,状态码 0
子进程推出,状态码 0</pre><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>
<?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_wifsignaled#— 子プロセスのステータス コードが正常終了を表すかどうかを確認します。通常終了 シグナルによる中断#pcntl_wtermsig
—子プロセスの中断を引き起こしたシグナルを返します詳細については、PHP 中国語 Web サイトをご覧ください: PHP ビデオ チュートリアル
以上がpcntl モジュールを有効にして PHP でマルチプロセス プログラミングを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。