摘要:是用編寫的,因此它對系統底層的操作與很像,同大多數語言一樣,進程間通信的方式有以下幾種消息隊列,管道,共享內存,和信號。創建管道創建進程,子進程寫管道,父進程讀管道通過函數創建一個子進程。當返回時表示創建進程失敗。
PHP是用C編寫的,因此它對系統底層API的操作與C很像,同大多數語言一樣,PHP進程間通信的方式有以下幾種:消息隊列,管道,共享內存,socket和信號。本文是對這幾種通信方式對整理:
管道通信PIPE管道用于承載簡稱之間的通訊數據。為了方便理解,可以將管道比作文件,進程A將數據寫到管道P中,然后進程B從管道P中讀取數據。php提供的管道操作API與操作文件的API基本一樣,除了創建管道使用posix_mkfifo函數,讀寫等操作均與文件操作函數相同。當然,你可以直接使用文件模擬管道,但是那樣無法使用管道的特性了。
通過管道通信的大概思路是,首先創建一個管道,然后子進程向管道中寫入信息,父進程從管道中讀取信息,這樣就可以做到父子進程直接實現通信了。
消息隊列消息隊列是存放在內存中的一種隊列數據結構。
0) { unset($childList[$childPid]); } } echo "({$parentPid})main progress end! ";運行結果:
create producer progresses: 21432 create producer progresses: 21433 create producer progresses: 21434 create consumer progresses: 21435 (21426) progress create! 2 | consumer(21435) destroy (21424) progress create! 1 | consumer(21436) destroy create consumer progresses: 21436 (21426) progress create! 3 | consumer(21436) destroy (21426) progress create! 4 | consumer(21435) destroy (21425) progress create! 3 | consumer(21436) destroy (21424) progress create! 2 | consumer(21435) destroy (21426) progress create! 5 | consumer(21435) destroy (21424) progress create! 3 | consumer(21436) destroy (21433)child progress end! (21425) progress create! 4 | consumer(21435) destroy (21424) progress create! 4 | consumer(21436) destroy (21434)child progress end! (21424) progress create! 5 | consumer(21435) destroy (21425) progress create! 5 | consumer(21436) destroy (21432)child progress end! (21435)child progress end! (21436)child progress end! (21431)main progress end!
信號量與共享內存0) { unset($childList[$childPid]); } } // 釋放共享內存與信號量 shm_remove($shareMemory); sem_remove($signal); echo "({$parentPid}) main progress end! ";運行結果:
使用信號量來實現共享內存的鎖機制parent progress pid:31720 create producer child progress: 31721 create producer child progress: 31722 (31721) count: 0 (31721) count: 1 (31721) count: 2 (31721) count: 3 (31721) count: 4 (31721) child progress end! create producer child progress: 31723 (31722) count: 5 (31722) count: 6 (31722) count: 7 (31722) count: 8 (31722) count: 9 (31722) child progress end! (31723) count: 10 (31723) count: 11 (31723) count: 12 (31723) count: 13 (31723) count: 14 (31723) child progress end! (31720) main progress end!無鎖情況
Warning: sem_release(): SysV semaphore 4357894312 (key 0x73048925) is not currently acquired in /Users/easyboom/www/example/信號量與共享內存.php on line 38
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25774.html
摘要:接受不到消息消息隊列通過指定而被創建后,任意一方銷毀了該隊列,都會導致其他發送或接收方失敗。用法場景進程,中代碼段要用到中代碼段的結果。完成了進程間同步問題此外進程間通信采用的方式是共享內存。 參考文章 深刻理解Linux進程間通信(IPC) 進程間通信(IPC)介紹 php高級應用之進程控制及進程間通訊 workman 作者發布 PHP 相關進程間通信擴展 -- System V ...
摘要:多進程通信之一命名管道。多進程通信之三信號量與共享內存。共享內存是最快是進程間通信方式,因為個進程之間并不需要數據復制,而是直接操控同一份數據。的一些書籍中甚至不建議新手輕易使用這種進程間通信的方式,因為這是一種極易產生死鎖的解決方案。 [原文地址:https://blog.ti-node.com/blog...] 往往開啟多進程的目的是為了一起干活加速效率,前面說了不同進程之間的內存...
摘要:擴展完成兼容機通用如獲取進程殺死進程等。擴展實現方式的進程間通信之消息隊列。四進程間通信通常中的進程通信方式有消息隊列信號量共享內存信號管道。下面這個例子中,父進程等待秒鐘,向子進程發送信號。子進程捕獲信號,掉信號處理函數處理。 一、引言 進程是一個具有獨立功能的程序關于某個數據集合的一次運行活動。換句話說就是,在系統調度多個cpu的時候,一個程序的基本單元。進程對于大多數的語言都不是...
閱讀 2382·2021-10-09 09:41
閱讀 3172·2021-09-26 09:46
閱讀 835·2021-09-03 10:34
閱讀 3151·2021-08-11 11:22
閱讀 3365·2019-08-30 14:12
閱讀 711·2019-08-26 11:34
閱讀 3344·2019-08-26 11:00
閱讀 1750·2019-08-26 10:26