最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP進(jìn)程通信基礎(chǔ)之信號(hào)

 更新時(shí)間:2017年02月19日 10:11:28   投稿:hebedich  
這篇文章主要介紹了PHP進(jìn)程通信基礎(chǔ)中的信號(hào)相關(guān)的基礎(chǔ)知識(shí)及示例,非常不錯(cuò),有需要的小伙伴可以參考下

使用信號(hào)通信??梢允褂胟ill -l 來(lái)查看當(dāng)前系統(tǒng)的信號(hào)類型。
每個(gè)信號(hào)所代表的的詳細(xì)含義,請(qǐng)查看我的這篇文章:http://m.fzitv.net/article/106040.htm
使用信號(hào)的時(shí)候可以通過php --version 來(lái)查看當(dāng)前PHP的版本。已決定使用哪種方式來(lái)進(jìn)行進(jìn)程間的信號(hào)通信。

[root@roverliang ipc]# php --version

PHP 5.6.24 (cli) (built: Aug 15 2016 19:14:02)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

使用pcntl_signal_dispatch 函數(shù) 需要PHP 版本(PHP 5 >= 5.3.0, PHP 7)

如果PHP版本小于5.3.一些大公司可能會(huì)低于這個(gè)版本。這個(gè)時(shí)候會(huì)使用 declare(ticks=1),意思為每執(zhí)行一條低級(jí)指令,
就會(huì)去檢測(cè)是否出現(xiàn)該信號(hào)。詳細(xì)的介紹可以查看 http://m.fzitv.net/article/48340.htm

官網(wǎng)解釋如下:Tick(時(shí)鐘周期)是一個(gè)在 declare 代碼段中解釋器每執(zhí)行 N 條可計(jì)時(shí)的低級(jí)語(yǔ)句就會(huì)發(fā)生的事件。N 的值是在 declare 中的 directive 部分用 ticks=N 來(lái)指定的。

那么什么是低級(jí)語(yǔ)句呢:如下代碼所示:

  for ($i = 0; $i < 3; $i++) {
    echo $i.PHP_EOL;
  }

那么這個(gè)for 循環(huán)中就含有三條低級(jí)指令。每輸出一條$i。就會(huì)去檢測(cè)下是否發(fā)生了已注冊(cè)的事件,可想而知,這樣效率是比較低的。所以如果檢測(cè)到自己的PHP大于等于5.3 。就使用pcntl_singal_dispath 來(lái)進(jìn)行信號(hào)派送。

主進(jìn)程在啟動(dòng)的時(shí)候注冊(cè)一些信號(hào)處理函數(shù)。

/**
 * @param $signal 信號(hào)
 */
function signalHandal($signal)
{
  switch ($signal) {
    case SIGINT:
      //do something
      break;
    case SIGHUP:
      //do something
      break;
    default :
      //do something
      break;
  }
}

然后將信號(hào)處理器與信號(hào)處理函數(shù)綁定:

//根據(jù)不同的信號(hào),安裝不同的信號(hào)處理器
pcntl_signal(SIGINT, 'signalHandal');
pcntl_signal(SIGHUP, 'signalHandal');
pcntl_signal(SIGUSR1, 'signalHandla');

在子進(jìn)程監(jiān)聽信號(hào),如果出現(xiàn)該信號(hào),就調(diào)用預(yù)安裝的信號(hào)處理函數(shù)

//分配信號(hào)。
pcntl_signal_dispatch($signal);

我們來(lái)整理下思路:
1、定義信號(hào)發(fā)生所需要處理事件的函數(shù)
2、將信號(hào)和信號(hào)處理函數(shù)綁定,稱為信號(hào)安裝。
3、信號(hào)監(jiān)聽或者分發(fā),出現(xiàn)信號(hào)調(diào)用已安裝的信號(hào)。

理解好上面的信號(hào)概念,我們來(lái)看一個(gè)demo:

<?php
$parentpid = posix_getpid();
echo "parent progress pid:{$parentpid}\n";

//定義一個(gè)信號(hào)處理函數(shù)

function sighandler($signal) {
  if ($signal == SIGINT) {
    $pid = getmypid();
    exit("{$pid} process, Killed!".PHP_EOL);
  }
}

//php version < 5.3 .每執(zhí)行一條低級(jí)指令,就檢查一次是否出現(xiàn)該信號(hào)。效率損耗很大。
//declare(ticks=1);
$child_list = [];
//注冊(cè)一個(gè)信號(hào)處理器。當(dāng)發(fā)出該信號(hào)的時(shí)候?qū)φ{(diào)用已定義的函數(shù)
pcntl_signal(SIGINT, 'sighandler');



for($i = 0; $i < 3; $i++) {
  $pid = pcntl_fork();
  if ($pid == 0) {
    //子進(jìn)程
    while (true) {
      //調(diào)用已安裝的信號(hào)信號(hào)處理器,為了檢測(cè)是否有新的信號(hào)等待dispatching
      pcntl_signal_dispatch();
      echo "I am child: ".getmypid(). " and i am running !".PHP_EOL;
      sleep(rand(1,3));
    }
  } elseif($pid > 0) {
    $child_list[] = $pid;
  } else {
    die('fork fail!'.PHP_EOL);
  }
}

sleep(5);
foreach ($child_list as $key => $pid) {
  posix_kill($pid, SIGINT);
}

sleep(2);
echo "{$parentpid} parent is end".PHP_EOL;

相關(guān)文章

最新評(píng)論

镇赉县| 娄烦县| 桐乡市| 西丰县| 农安县| 米泉市| 兰坪| 盐山县| 绿春县| 鹤山市| 南京市| 土默特右旗| 绥阳县| 兖州市| 从化市| 烟台市| 屏东县| 贵州省| 正定县| 宁德市| 泽库县| 乌兰浩特市| 桦川县| 枣庄市| 鹿邑县| 聂荣县| 凤台县| 潼南县| 台中市| 天津市| 巴林左旗| 临邑县| 泗水县| 克山县| 石狮市| 安义县| 雷州市| 乌苏市| 罗甸县| 双桥区| 浦江县|