亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

php 中的信號(hào)處理操作實(shí)例詳解

 更新時(shí)間:2020年03月04日 12:31:04   作者:懷素真  
這篇文章主要介紹了php 中的信號(hào)處理操作,結(jié)合實(shí)例形式詳細(xì)分析了php 信號(hào)處理相關(guān)函數(shù)、原理、使用方法及操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了php 中的信號(hào)處理操作。分享給大家供大家參考,具體如下:

首先我們需要了解幾個(gè)函數(shù)

pcntl_signal   安裝信號(hào)處理器,也就是當(dāng)指定信號(hào)發(fā)生時(shí),調(diào)用函數(shù)。
pcntl_alarm   指定秒數(shù)后向進(jìn)程發(fā)送SIGALRM信號(hào)。
posix_getpid 返回當(dāng)前進(jìn)程id
posix_kill       給指定進(jìn)程發(fā)送信號(hào)

一些常用的信號(hào)說(shuō)明

SIGHUP
本信號(hào)在用戶(hù)終端連接(正?;蚍钦?結(jié)束時(shí)發(fā)出, 通常是在終端的控制進(jìn)程結(jié)束時(shí),
通知同一session內(nèi)的各個(gè)作業(yè), 這時(shí)它們與控制終端不再關(guān)聯(lián)。

SIGINT
程序終止(interrupt)信號(hào), 在用戶(hù)鍵入INTR字符(通常是Ctrl-C)時(shí)發(fā)出。

SIGQUIT
和SIGINT類(lèi)似,但由QUIT字符(通常是Ctrl-/)來(lái)控制;進(jìn)程在因收到SIGQUIT退出時(shí)會(huì)產(chǎn)生core文件,
在這個(gè)意義上類(lèi)似于一個(gè)程序錯(cuò)誤信號(hào)。

SIGKILL
用來(lái)立即結(jié)束程序的運(yùn)行。本信號(hào)不能被阻塞、處理和忽略。如果管理員發(fā)現(xiàn)某個(gè)進(jìn)程終止不了,可嘗試發(fā)送這個(gè)信號(hào)。

SIGTERM
程序結(jié)束(terminate)信號(hào), 與SIGKILL不同的是該信號(hào)可以被阻塞和處理。通常用來(lái)要求程序自己正常退出,
shell命令kill缺省產(chǎn)生這個(gè)信號(hào)。如果進(jìn)程終止不了,我們才會(huì)嘗試SIGKILL。

SIGUSR1
留給用戶(hù)使用

SIGUSR2
留給用戶(hù)使用

SIGALRM
時(shí)鐘定時(shí)信號(hào), 計(jì)算的是實(shí)際的時(shí)間或時(shí)鐘時(shí)間。alarm函數(shù)使用該信號(hào)。

SIGCHLD
子進(jìn)程結(jié)束時(shí), 父進(jìn)程會(huì)收到這個(gè)信號(hào)。

例1:

<?php
declare(ticks = 1);
//信號(hào)處理函數(shù)
function sig_func() {
  echo "child exit \r\n";
}
//設(shè)置信號(hào)處理器
pcntl_signal(SIGCHLD, 'sig_func');
$pid = pcntl_fork();
if($pid == -1) {
  die('fork error');
} else if ($pid) {
  pcntl_wait($status);
} else {
  echo "child... \r\n";
  exit;
}

當(dāng)子進(jìn)程退出時(shí),會(huì)向父進(jìn)程發(fā)送SIGCHLD信號(hào),我們通過(guò)設(shè)置信號(hào)處理器,成功的處理信號(hào)。

例2:

<?php
declare(ticks = 1);
//信號(hào)處理函數(shù)
function sig_func($signo) {
  switch($signo) {
    case SIGCHLD: {
      echo "child SIGCHLD \r\n";
      break;
    }
    case SIGTERM: {
      echo "child SIGTERM \r\n";
      break;
    }
    default:
      //處理所有其他信號(hào)
      break;
  }
}
//設(shè)置信號(hào)處理器
pcntl_signal(SIGCHLD, 'sig_func');
//設(shè)置信號(hào)處理器
pcntl_signal(SIGTERM, 'sig_func');
$pid = pcntl_fork();
if($pid == -1) {
  die('fork error');
} else if ($pid) {
  pcntl_wait($status);
} else {
  sleep(3);
  echo "child \r\n";
  sleep(3);
  posix_kill(getmypid(), SIGTERM);
  exit;
}

父進(jìn)程等待子進(jìn)程的退出,子進(jìn)程等待3秒后輸出child,再等待3秒后向自身發(fā)送結(jié)束程序信號(hào)。

例3:

<?php
declare(ticks = 1);
//信號(hào)處理函數(shù)
function sig_func($signo) {
  switch($signo) {
    case SIGCHLD: {
      echo "child SIGCHLD \r\n";
      break;
    }
    /*這里要把處理SIGTERM信號(hào)的代碼注釋掉
    case SIGTERM: {
      echo "child SIGTERM \r\n";
      break;
    }*/
    default:
      //處理所有其他信號(hào)
      break;
  }
}
//設(shè)置信號(hào)處理器
pcntl_signal(SIGCHLD, 'sig_func');
//設(shè)置信號(hào)處理器,也注釋掉
//不然當(dāng)父進(jìn)程發(fā)向子進(jìn)程發(fā)送SIGTERM信號(hào)時(shí),子進(jìn)程不會(huì)退出,還會(huì)繼續(xù)執(zhí)行
//我們的信號(hào)處理函數(shù)把SIGTERM給忽略了
//pcntl_signal(SIGTERM, 'sig_func');
$pid = pcntl_fork();
if($pid == -1) {
  die('fork error');
} else if ($pid) {
  sleep(30);
  posix_kill($pid, SIGTERM);
} else {
  $cnt = 0;
  for(;;) {
    sleep(3);
    echo $cnt, '-';
    ++$cnt;
  }
  exit;
}

父進(jìn)程在等待30秒后,向子進(jìn)程發(fā)送SIGTERM結(jié)束程序信號(hào)。如果我們?cè)O(shè)置了SIGTERM信號(hào)的處理器,并且在自定義信號(hào)處理器中并沒(méi)有殺死該進(jìn)程,則該子進(jìn)程會(huì)一直運(yùn)行下去。

pcntl_signal()函數(shù)僅僅是注冊(cè)信號(hào)和它的處理方法,真正接收到信號(hào)并調(diào)用其處理方法的是pcntl_signal_dispatch()函數(shù)。

例4:

<?php
//使用ticks需要PHP 4.3.0以上版本
//declare(ticks = 1);
function sig_func() {
  echo "SIGALRM \r\n";
}
//設(shè)置信號(hào)處理器
pcntl_signal(SIGALRM, 'sig_func');
pcntl_alarm(3);

通過(guò)函數(shù)pcntl_alarm()3秒后給進(jìn)程發(fā)送SIGALRM信號(hào),但信號(hào)處理函數(shù)并未調(diào)用。
原因是我們注釋了declare(ticks = 1);這段代碼,而又沒(méi)有調(diào)用pcntl_signal_dispatch()函數(shù)。

declare(ticks = 1);表示每執(zhí)行一條低級(jí)指令,就檢查一次信號(hào),如果檢測(cè)到注冊(cè)的信號(hào),就調(diào)用其信號(hào)處理器。但是這種處理方式效率很低,建議在代碼循環(huán)中通過(guò)pcntl_signal_dispatch()來(lái)處理信號(hào)。

<?php
//使用ticks需要PHP 4.3.0以上版本
//declare(ticks = 1);
function sig_func() {
  echo "SIGALRM \r\n";
}
//設(shè)置信號(hào)處理器
pcntl_signal(SIGALRM, 'sig_func');
pcntl_alarm(3);
//因?yàn)?秒后pcntl_alarm函數(shù)才會(huì)給進(jìn)程發(fā)送SIGALRM信號(hào)
//所以我們通過(guò)sleep函數(shù)等待3秒后,調(diào)用pcntl_signal_dispatch()來(lái)處理信號(hào)
sleep(3);
pcntl_signal_dispatch();

pcntl_signal_dispatch()這個(gè)函數(shù)是PHP5.3以上才支持的,如果你的PHP版本大于5.3,建議使用這個(gè)方法調(diào)用信號(hào)處理器。
5.3以下的版本需要在注冊(cè)信號(hào)之前加上:declare(ticks = 1);

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《PHP進(jìn)程與線程操作技巧總結(jié)》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》、《PHP基本語(yǔ)法入門(mén)教程》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門(mén)教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

相關(guān)文章

最新評(píng)論