摘要:為了解決這個問題,我們必須引入互斥機制。實現互斥機制的最簡單辦法就是使用信號燈。信號量是另外一種進程間的方式,它同其他機構管道消息隊列不同。在這個停車場系統中,車位是公共資源,每輛車好比一個線程,看門人起的就是信號量的作用。
在多帶帶的一個PHP進程中讀寫、創建、刪除共享內存方面上你應該沒有問題了。但是實際運行中不可能只是一個PHP進程在運行中。如果在多個進程的情況下你還是沿用單個進程的處理方法,你一定會碰到問題--著名的并行和互斥問題。比如說有2個進程同時需要對同一段內存進行讀寫。當兩個進程同時執行寫入操作時,你將得到一個錯誤的數據,因為該段內存將之可能是最后執行的進程的內容,甚至是由2個進程寫入的數據輪流隨機出現的一段混合的四不象。這顯然是不能接受的。為了解決這個問題,我們必須引入互斥機制。互斥機制在很多操作系統的教材上都有專門講述,這里不多重復。實現互斥機制的最簡單辦法就是使用信號燈。信號量是另外一種進程間(IPC)的方式,它同其他IPC機構(管道、FIFO、消息隊列)不同。
說到信號量可能大家都很陌生,作為php肯定知道mysql、redis中的鎖,當然還有php文件鎖。說白了就是鎖,用來解決進程(線程同步的問題),訪問前獲取鎖(獲取不到則等待),訪問后釋放鎖。
信號量的作用就是,考慮是否有多個進程同時寫入數據到共享內存的情況,是否需要避免沖突。
舉一個生活中的例子:以一個停車場的運作為例。簡單起見,假設停車場只有三個車位,一開始三個車位都是空的。這時如果同時來了五輛車,看門人允許其中三輛直接進入,然后放下車攔,剩下的車則必須在入口等待,此后來的車也都不得不在入口處等待。這時,有一輛車離開停車場,看門人得知后,打開車攔,放入外面的一輛進去,如果又離開兩輛,則又可以放入兩輛,如此往復。在這個停車場系統中,車位是公共資源,每輛車好比一個線程,看門人起的就是信號量的作用。
記得給環境開啟兩個擴展【enable-shmop --enable-sysvsem】
因為php默認不支持這些函數,所以需要重編譯php。如要使用:
System V信號量,編譯時加上 –enable-sysvsem
System V共享內存,編譯時加上 –enable-sysvshm
System V消息隊列,編譯時加上 –enable-sysvmsg
Shared Memory,編譯時加上 –enable-shmop
信號量系列函數
簡單小案例
如果出現報錯:Warning: sem_release(): SysV semaphore 140680297324568 (key 0x4337b101) is not currently acquired in /usr/local/nginx/html/index.php on line 38
那是因為沒有獲得鎖~
在Linux下命令觀察,查看系統共享內存,信號量,隊列
# ipcs# ipcs -s //多帶帶查看信號量的話,使用ipcs -s命令稍微復雜的案例
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);實際運用中根據場景靈活運用就可以了~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/28938.html
摘要:為了解決這個問題,我們必須引入互斥機制。實現互斥機制的最簡單辦法就是使用信號燈。信號量是另外一種進程間的方式,它同其他機構管道消息隊列不同。在這個停車場系統中,車位是公共資源,每輛車好比一個線程,看門人起的就是信號量的作用。 在單獨的一個PHP進程中讀寫、創建、刪除共享內存方面上你應該沒有問題了。但是實際運行中不可能只是一個PHP進程在運行中。如果在多個進程的情況下你還是沿用單個進程的...
摘要:如果是這樣,就需要引入信號量進行控制。這應該是因為正在共享內存被上一次操作占用中還沒有釋放導致。 共享內存 共享內存的使用主要是為了能夠在同一臺機器不同的進程中共享一些數據,比如在多個 php-fpm 進程中共享當前進程的使用情況。這種通信也稱為進程間通信(Inter-Process Communication),簡稱 IPC。 PHP 內置的 shmop 擴展 (Shared Mem...
閱讀 2577·2019-08-30 10:53
閱讀 3183·2019-08-29 16:20
閱讀 2933·2019-08-29 15:35
閱讀 1751·2019-08-29 12:24
閱讀 2865·2019-08-28 18:19
閱讀 1838·2019-08-23 18:07
閱讀 2314·2019-08-23 15:31
閱讀 1158·2019-08-23 14:05