主頁 > 知識庫 > php 中的信號處理操作實例詳解

php 中的信號處理操作實例詳解

熱門標簽:辦理400電話哪家好點 重慶外呼電銷系統(tǒng)多少錢 濟源百應(yīng)電銷機器人聯(lián)系方式 咸陽電銷 南京3D地圖標注 嘟嘟云外呼系統(tǒng) 南寧電話外呼系統(tǒng)線路 正規(guī)電銷機器人系統(tǒng) 邢臺400電話辦理

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

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

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

一些常用的信號說明

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

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

SIGQUIT
和SIGINT類似,但由QUIT字符(通常是Ctrl-/)來控制;進程在因收到SIGQUIT退出時會產(chǎn)生core文件,
在這個意義上類似于一個程序錯誤信號。

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

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

SIGUSR1
留給用戶使用

SIGUSR2
留給用戶使用

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

SIGCHLD
子進程結(jié)束時, 父進程會收到這個信號。

例1:

?php
declare(ticks = 1);
//信號處理函數(shù)
function sig_func() {
  echo "child exit \r\n";
}
//設(shè)置信號處理器
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;
}

當子進程退出時,會向父進程發(fā)送SIGCHLD信號,我們通過設(shè)置信號處理器,成功的處理信號。

例2:

?php
declare(ticks = 1);
//信號處理函數(shù)
function sig_func($signo) {
  switch($signo) {
    case SIGCHLD: {
      echo "child SIGCHLD \r\n";
      break;
    }
    case SIGTERM: {
      echo "child SIGTERM \r\n";
      break;
    }
    default:
      //處理所有其他信號
      break;
  }
}
//設(shè)置信號處理器
pcntl_signal(SIGCHLD, 'sig_func');
//設(shè)置信號處理器
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;
}

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

例3:

?php
declare(ticks = 1);
//信號處理函數(shù)
function sig_func($signo) {
  switch($signo) {
    case SIGCHLD: {
      echo "child SIGCHLD \r\n";
      break;
    }
    /*這里要把處理SIGTERM信號的代碼注釋掉
    case SIGTERM: {
      echo "child SIGTERM \r\n";
      break;
    }*/
    default:
      //處理所有其他信號
      break;
  }
}
//設(shè)置信號處理器
pcntl_signal(SIGCHLD, 'sig_func');
//設(shè)置信號處理器,也注釋掉
//不然當父進程發(fā)向子進程發(fā)送SIGTERM信號時,子進程不會退出,還會繼續(xù)執(zhí)行
//我們的信號處理函數(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;
}

父進程在等待30秒后,向子進程發(fā)送SIGTERM結(jié)束程序信號。如果我們設(shè)置了SIGTERM信號的處理器,并且在自定義信號處理器中并沒有殺死該進程,則該子進程會一直運行下去。

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

例4:

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

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

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

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

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

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

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

您可能感興趣的文章:
  • python多線程下信號處理程序示例
  • PHP信號處理機制的操作代碼講解
  • 對Python信號處理模塊signal詳解
  • Golang信號處理及如何實現(xiàn)進程的優(yōu)雅退出詳解
  • Perl信號處理學(xué)習(xí)簡單小結(jié)
  • 詳細分析C++ 信號處理

標簽:河南 唐山 平頂山 武漢 隴南 通遼 黃山 南通

巨人網(wǎng)絡(luò)通訊聲明:本文標題《php 中的信號處理操作實例詳解》,本文關(guān)鍵詞  php,中的,信號處理,操作,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《php 中的信號處理操作實例詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于php 中的信號處理操作實例詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章