PHP進(jìn)程通信基礎(chǔ)之信號(hào)量與共享內(nèi)存通信
由于進(jìn)程之間誰(shuí)先執(zhí)行并不確定,這取決于內(nèi)核的進(jìn)程調(diào)度算法,其中比較復(fù)雜。由此有可能多進(jìn)程在相同的時(shí)間內(nèi)同時(shí)訪問(wèn)共享內(nèi)存,從而造成不可預(yù)料的錯(cuò)誤。信號(hào)量這個(gè)名字起的令人莫名其妙,但是看其英文原意,就十分容易理解。
semaphore 英[ˈseməfɔ:(r)] vt. 發(fā)出信號(hào),打旗語(yǔ);
類似于指揮官的作用。
下面我們看下一個(gè)偽代碼信號(hào)量的使用。
1、創(chuàng)建信號(hào)量唯一標(biāo)識(shí)符
$ftok = ftok(__FILE__, 'a');
2、創(chuàng)建信號(hào)量資源ID
$sem_resouce_id = sem_get($ftok);
3、接受信號(hào)量
sem_acqure($sem_resource_id);
4、釋放信號(hào)量
sem_release($sem_resource_id);
5、銷毀信號(hào)量
sem_remove($sem_resource_id);
舉個(gè)不文雅的例子,使我們?nèi)菀桌斫膺@個(gè)信號(hào)量在生活中的用法。理解之后可以套用到我們編程領(lǐng)域。
一家公司只有一個(gè)衛(wèi)生間。那么當(dāng)有人上廁所的時(shí)候,都要獲取一把鎖(信號(hào)量),表示衛(wèi)生間正在使用。代碼如下:
sem_acqure($sem_resource_id);
那么員工上完廁所之后,就需要將鎖打開,釋放鎖(信號(hào)量),表示現(xiàn)在可以允許別人使用。代碼如下:
sem_release($sem_resource_id);
通過(guò)一個(gè)簡(jiǎn)單的鎖,我們就能夠知道當(dāng)前的廁所(共享內(nèi)存)是否可以使用。這個(gè)例子不雅觀,但說(shuō)明了問(wèn)題。這篇博客也是有味道的博客,真是不容易。。。。以下是示例代碼:
<?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);
相關(guān)文章
PHP網(wǎng)絡(luò)安全之命令執(zhí)行漏洞及防御
這篇文章主要介紹了PHP命令執(zhí)行漏洞及防御,網(wǎng)絡(luò)安全越來(lái)越受重視的今天,漏洞與防御都需要有所了解,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07phpMyAdmin 鏈接表的附加功能尚未激活問(wèn)題的解決方法(已測(cè))
今天幫客戶配置phpmyadmin,一直有“鏈接表的附加功能尚未激活”的問(wèn)題,登陸phpmyadmin后,會(huì)在底部顯示“鏈接表的附加功能尚未激活。要查出原因,請(qǐng)點(diǎn)擊此處?!钡奶崾尽?/div> 2012-03-03php下實(shí)現(xiàn)在指定目錄搜索指定類型文件的函數(shù)
php在特定目錄中找特定類型的文件2008-10-10用php實(shí)現(xiàn)的下載css文件中的圖片的代碼
非常有創(chuàng)意的利用php獲取css中圖片地址并實(shí)現(xiàn)下載的代碼。2010-02-02PHP取整數(shù)函數(shù)常用的四種方法小結(jié)
PHP取整數(shù)函數(shù)常用的四種方法,下面收集了四個(gè)函數(shù);經(jīng)常用到取整的函數(shù),今天小小的總結(jié)一下!其實(shí)很簡(jiǎn)單,就是幾個(gè)函數(shù)而已~~主要是:ceil,floor,round,intval2012-07-07與文件上傳有關(guān)的php配置參數(shù)總結(jié)
搞個(gè)了圖片上傳,死活不好使,后來(lái)發(fā)現(xiàn)是php參數(shù)配置的問(wèn)題,下面總結(jié)下與文件上傳有關(guān)的php參數(shù),有類似情況的朋友可以參考下哈2013-06-06最新評(píng)論