您好,登錄后才能下訂單哦!
這篇文章主要講解了“php信號量和共享內存有什么用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“php信號量和共享內存有什么用”吧!
說明
1、信號量:是系統提供的一種原子操作,一個信號數量,同時只有一個進程能操作。一個過程獲得一個信號,必須被過程釋放。
2、共享內存:是系統在存儲器中打開的一個公共存儲器區域,任何一個過程都可以訪問,在同一時刻,可以有多個過程訪問該區域,為了保證數據的一致性,需要對該存儲器區域進行鎖定或信號。
實例
echo "parent progress pid:{$parentPid}\n"; $childList = array(); // 創建共享內存,創建信號量,定義共享key $shm_id = ftok(__FILE__,'m'); $sem_id = ftok(__FILE__,'s'); $shareMemory = shm_attach($shm_id); $signal = sem_get($sem_id); const SHARE_KEY = 1; // 生產者 function producer(){ global $shareMemory; global $signal; $pid = posix_getpid(); $repeatNum = 5; for ( $i = 1; $i <= $repeatNum; $i++) { // 獲得信號量 sem_acquire($signal); if (shm_has_var($shareMemory,SHARE_KEY)){ // 有值,加一 $count = shm_get_var($shareMemory,SHARE_KEY); $count ++; shm_put_var($shareMemory,SHARE_KEY,$count); echo "({$pid}) count: {$count}\n"; }else{ // 無值,初始化 shm_put_var($shareMemory,SHARE_KEY,0); echo "({$pid}) count: 0\n"; } // 用完釋放 sem_release($signal); $rand = rand(1,3); sleep($rand); } } function createProgress($callback){ $pid = pcntl_fork(); if ( $pid == -1) { // 創建失敗 exit("fork progress error!\n"); } else if ($pid == 0) { // 子進程執行程序 $pid = posix_getpid(); $callback(); exit("({$pid})child progress end!\n"); }else{ // 父進程執行程序 return $pid; } } // 3個寫進程 for ($i = 0; $i < 3; $i ++ ) { $pid = createProgress('producer'); $childList[$pid] = 1; echo "create producer child progress: {$pid} \n"; } // 等待所有子進程結束 while(!empty($childList)){ $childPid = pcntl_wait($status); if ($childPid > 0){ unset($childList[$childPid]); } } // 釋放共享內存與信號量 shm_remove($shareMemory); sem_remove($signal); echo "({$parentPid})main progress end!\n";
感謝各位的閱讀,以上就是“php信號量和共享內存有什么用”的內容了,經過本文的學習后,相信大家對php信號量和共享內存有什么用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。