《PHP實(shí)例:PHP進(jìn)程通信基礎(chǔ)之信號(hào)量與共享內(nèi)存通信》要點(diǎn):
本文介紹了PHP實(shí)例:PHP進(jìn)程通信基礎(chǔ)之信號(hào)量與共享內(nèi)存通信,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
PHP應(yīng)用由于進(jìn)程之間誰(shuí)先執(zhí)行并不確定,這取決于內(nèi)核的進(jìn)程調(diào)度算法,其中比較復(fù)雜.由此有可能多進(jìn)程在相同的時(shí)間內(nèi)同時(shí)訪問共享內(nèi)存,從而造成不可預(yù)料的錯(cuò)誤.信號(hào)量這個(gè)名字起的令人莫名其妙,但是看其英文原意,就十分容易理解.
PHP應(yīng)用semaphore 英[?sem?f?:(r)] vt. 發(fā)出信號(hào),打旗語(yǔ);
PHP應(yīng)用類似于指揮官的作用.
PHP應(yīng)用下面我們看下一個(gè)偽代碼信號(hào)量的使用.
PHP應(yīng)用1、創(chuàng)建信號(hào)量唯一標(biāo)識(shí)符
PHP應(yīng)用$ftok = ftok(__FILE__, 'a');
PHP應(yīng)用2、創(chuàng)建信號(hào)量資源ID
PHP應(yīng)用$sem_resouce_id = sem_get($ftok);
PHP應(yīng)用3、接受信號(hào)量
PHP應(yīng)用sem_acqure($sem_resource_id);
PHP應(yīng)用4、釋放信號(hào)量
PHP應(yīng)用sem_release($sem_resource_id);
PHP應(yīng)用5、銷毀信號(hào)量
PHP應(yīng)用sem_remove($sem_resource_id);
PHP應(yīng)用舉個(gè)不文雅的例子,使我們?nèi)菀桌斫膺@個(gè)信號(hào)量在生活中的用法.理解之后可以套用到我們編程領(lǐng)域.
一家公司只有一個(gè)衛(wèi)生間.那么當(dāng)有人上廁所的時(shí)候,都要獲取一把鎖(信號(hào)量),表示衛(wèi)生間正在使用.代碼如下:
PHP應(yīng)用sem_acqure($sem_resource_id);
PHP應(yīng)用那么員工上完廁所之后,就需要將鎖打開,釋放鎖(信號(hào)量),表示現(xiàn)在可以允許別人使用.代碼如下:
PHP應(yīng)用sem_release($sem_resource_id);
PHP應(yīng)用通過一個(gè)簡(jiǎn)單的鎖,我們就能夠知道當(dāng)前的廁所(共享內(nèi)存)是否可以使用.這個(gè)例子不雅觀,但說明了問題.這篇博客也是有味道的博客,真是不容易....以下是示例代碼:
PHP應(yīng)用
<?php
//創(chuàng)建共享內(nèi)存區(qū)域
$shm_key = ftok(__FILE__, 'a');
$shm_id = shm_attach($shm_key, 1024, 0755);
//var_dump($shm_id);die(); resource(4) of type (sysvshm)
const SHARE_KEY = 1;
$child_list = [];
//加入信號(hào)量
$sem_id = ftok(__FILE__, 'b');
$signal = sem_get($sem_id);
//$signal resource(5) of type (sysvsem)
for ($i = 0; $i < 3; $i++) {
$pid = pcntl_fork();
if ($pid == -1) {
exit("Fork fail!".PHP_EOL);
} elseif ($pid == 0) {
//獲取信號(hào)量
sem_acquire($signal);
if (shm_has_var($shm_id,SHARE_KEY)) {
$count = shm_get_var($shm_id, SHARE_KEY);
$count++;
//模擬業(yè)務(wù)處理
$sec = rand(1, 3);
sleep($sec);
shm_put_var($shm_id, SHARE_KEY, $count);
} else {
$count = 0;
$sec = rand(1, 3);
sleep($sec);
shm_put_var($shm_id, SHARE_KEY, $count);
}
echo "child process: ".getmypid()." is writing! now count is: $count ".PHP_EOL;
//釋放信號(hào)量
sem_release($signal);
exit("child process".getmypid()."end".PHP_EOL);
} else {
$child_list[] = $pid;
}
}
while (count($child_list) > 0) {
foreach ($child_list as $key => $pid) {
$status = pcntl_waitpid($pid, $status);
if ($status > 0 || $status == -1) {
unset($child_list[$key]);
}
}
sleep(1);
}
$count = shm_get_var($shm_id, SHARE_KEY);
echo " $count ".PHP_EOL;
//銷毀信號(hào)量
sem_remove($signal);
shm_remove($shm_id);
shm_detach($shm_id);
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.snjht.com/jiaocheng/1723.html