您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“PHP信號量與共享內(nèi)存通信的使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“PHP信號量與共享內(nèi)存通信的使用”吧!
由于進(jìn)程之間誰先執(zhí)行并不確定,這取決于內(nèi)核的進(jìn)程調(diào)度算法,其中比較復(fù)雜。由此有可能多進(jìn)程在相同的時(shí)間內(nèi)同時(shí)訪問共享內(nèi)存,從而造成不可預(yù)料的錯(cuò)誤。信號量這個(gè)名字起的令人莫名其妙,但是看其英文原意,就十分容易理解。
semaphore 英[?sem?f?:(r)] vt. 發(fā)出信號,打旗語;
類似于指揮官的作用。
下面我們看下一個(gè)偽代碼信號量的使用。
1、創(chuàng)建信號量唯一標(biāo)識符
$ftok = ftok(__FILE__, 'a');
2、創(chuàng)建信號量資源ID
$sem_resouce_id = sem_get($ftok);
3、接受信號量
sem_acqure($sem_resource_id);
4、釋放信號量
sem_release($sem_resource_id);
5、銷毀信號量
sem_remove($sem_resource_id);
舉個(gè)不文雅的例子,使我們?nèi)菀桌斫膺@個(gè)信號量在生活中的用法。理解之后可以套用到我們編程領(lǐng)域。
一家公司只有一個(gè)衛(wèi)生間。那么當(dāng)有人上廁所的時(shí)候,都要獲取一把鎖(信號量),表示衛(wèi)生間正在使用。代碼如下:
sem_acqure($sem_resource_id);
那么員工上完廁所之后,就需要將鎖打開,釋放鎖(信號量),表示現(xiàn)在可以允許別人使用。代碼如下:
sem_release($sem_resource_id);
通過一個(gè)簡單的鎖,我們就能夠知道當(dāng)前的廁所(共享內(nèi)存)是否可以使用。這個(gè)例子不雅觀,但說明了問題。這篇博客也是有味道的博客,真是不容易。。。。以下是示例代碼:
<?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 = []; //加入信號量 $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) { //獲取信號量 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; //釋放信號量 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; //銷毀信號量 sem_remove($signal); shm_remove($shm_id); shm_detach($shm_id);
到此,相信大家對“PHP信號量與共享內(nèi)存通信的使用”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。