PHP進(jìn)程通信基礎(chǔ)之信號(hào)
使用信號(hào)通信??梢允褂胟ill -l 來(lái)查看當(dāng)前系統(tǒng)的信號(hào)類型。
每個(gè)信號(hào)所代表的的詳細(xì)含義,請(qǐng)查看我的這篇文章:http://www.dhdzp.com/article/106040.htm
使用信號(hào)的時(shí)候可以通過(guò)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://www.dhdzp.com/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)聽(tīng)信號(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)聽(tīng)或者分發(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)文章
在PHP上顯示JFreechart畫(huà)的統(tǒng)計(jì)圖方法
在JSP上的servlet能完全的顯示出JFreechart畫(huà)的統(tǒng)計(jì)圖,但是和其他語(yǔ)言混合運(yùn)用就不能顯示了,下面為大家介紹下如何在PHP上顯示JFreechart2013-11-11
PHP根據(jù)手機(jī)號(hào)判斷運(yùn)營(yíng)商(詳細(xì)介紹附代碼)
這篇文章主要介紹了PHP根據(jù)手機(jī)號(hào)判斷運(yùn)營(yíng)商,詳細(xì)介紹附代碼,大家可以根據(jù)最新的號(hào)段進(jìn)行添加即可,通過(guò)正則判斷實(shí)現(xiàn),需要的朋友可以參考下2018-01-01
如何對(duì)PHP程序中的常見(jiàn)漏洞進(jìn)行攻擊(上)
如何對(duì)PHP程序中的常見(jiàn)漏洞進(jìn)行攻擊(上)...2006-12-12
php輸入數(shù)據(jù)統(tǒng)一類實(shí)例
這篇文章主要介紹了php輸入數(shù)據(jù)統(tǒng)一類,實(shí)例分析了針對(duì)輸入數(shù)據(jù)的各種轉(zhuǎn)換技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02
PHP實(shí)現(xiàn)鏈?zhǔn)讲僮鞯娜N方法詳解
這篇文章主要介紹了PHP實(shí)現(xiàn)鏈?zhǔn)讲僮鞯娜N方法,結(jié)合實(shí)例形式分析了php鏈?zhǔn)讲僮鞯南嚓P(guān)實(shí)現(xiàn)技巧與使用注意事項(xiàng),需要的朋友可以參考下2017-11-11

