PHPマルチプロセスのシグナルに関連する問題

WBOY
リリース: 2016-06-13 12:38:50
オリジナル
806 人が閲覧しました

PHP マルチプロセスのシグナルの問題

1. 次のコードのスリープ時間は 20

よりもはるかに短いです。

<?php 
// 当子进程退出时,会触发该函数
function sig_handler($sig) {
	switch($sig) {
		case SIGCHLD:
			echo 'SIGCHLD received'."n";
	}
}
  
pcntl_signal(SIGCHLD, "sig_handler");// 注册子进程退出时调用的函数

$start          = time(); 

$sub_process_cnt = 20;
for($i=0;$i<$sub_process_cnt;$i++) { 
  
	sleep(1);   
	 
	$pid  = pcntl_fork(); 
	if ($pid == 0) {

		exit(-1);
	}
}


$status = 0;
 
for ($k=0; $k<$sub_process_cnt; $k++) 
{
	pcntl_waitpid(-1, $status );
}


$end            = time();
$usage          = $end - $start;
print "End, use: ".$usage." seconds" ;
    
?>
ログイン後にコピー
2. 理由: 子プロセスから返されたシグナルによってスリープ プロセスが中断されました。

3. 解決策:

pcntl_signal(SIGCHLD, SIG_IGN) //子プロセスの戻り信号を無視します

すべてのコードは次のとおりです

<?php 
// 当子进程退出时,会触发该函数
function sig_handler($sig) {
	switch($sig) {
		case SIGCHLD:
			echo 'SIGCHLD received'."n";
	}
}
  
pcntl_signal(SIGCHLD, SIG_IGN );// 注册子进程退出时调用的函数

$start          = time(); 

$sub_process_cnt = 20;
for($i=0;$i<$sub_process_cnt;$i++) { 
  
	sleep(1);   
	 
	$pid  = pcntl_fork(); 
	if ($pid == 0) {

		exit(-1);
	}
}


$status = 0;
 
for ($k=0; $k<$sub_process_cnt; $k++) 
{
	pcntl_waitpid(-1, $status );
}


$end            = time();
$usage          = $end - $start;
print "End, use: ".$usage." seconds" ;
    
?>
ログイン後にコピー


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート