摘要:是用編寫的,因此它對系統(tǒng)底層的操作與很像,同大多數(shù)語言一樣,進(jìn)程間通信的方式有以下幾種消息隊列,管道,共享內(nèi)存,和信號。創(chuàng)建管道創(chuàng)建進(jìn)程,子進(jìn)程寫管道,父進(jìn)程讀管道通過函數(shù)創(chuàng)建一個子進(jìn)程。當(dāng)返回時表示創(chuàng)建進(jìn)程失敗。
PHP是用C編寫的,因此它對系統(tǒng)底層API的操作與C很像,同大多數(shù)語言一樣,PHP進(jìn)程間通信的方式有以下幾種:消息隊列,管道,共享內(nèi)存,socket和信號。本文是對這幾種通信方式對整理:
管道通信PIPE管道用于承載簡稱之間的通訊數(shù)據(jù)。為了方便理解,可以將管道比作文件,進(jìn)程A將數(shù)據(jù)寫到管道P中,然后進(jìn)程B從管道P中讀取數(shù)據(jù)。php提供的管道操作API與操作文件的API基本一樣,除了創(chuàng)建管道使用posix_mkfifo函數(shù),讀寫等操作均與文件操作函數(shù)相同。當(dāng)然,你可以直接使用文件模擬管道,但是那樣無法使用管道的特性了。
通過管道通信的大概思路是,首先創(chuàng)建一個管道,然后子進(jìn)程向管道中寫入信息,父進(jìn)程從管道中讀取信息,這樣就可以做到父子進(jìn)程直接實現(xiàn)通信了。
消息隊列消息隊列是存放在內(nèi)存中的一種隊列數(shù)據(jù)結(jié)構(gòu)。
0) { unset($childList[$childPid]); } } echo "({$parentPid})main progress end! ";運行結(jié)果:
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!
信號量與共享內(nèi)存0) { unset($childList[$childPid]); } } // 釋放共享內(nèi)存與信號量 shm_remove($shareMemory); sem_remove($signal); echo "({$parentPid}) main progress end! ";運行結(jié)果:
使用信號量來實現(xiàn)共享內(nèi)存的鎖機(jī)制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/信號量與共享內(nèi)存.php on line 38
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/25774.html
摘要:一進(jìn)程間通信理解間進(jìn)程通信機(jī)制,先了解下進(jìn)程間有哪些通訊機(jī)制歷史發(fā)展按照歷史來源主要有兩大塊的管道,,信號的消息隊列,共享內(nèi)存,信號燈。信號量主要作為進(jìn)程間,以及進(jìn)程內(nèi)部線程之間的通訊手段。主要依賴,兼容擴(kuò)展實現(xiàn)方式的進(jìn)程間通信之消息隊列。 PHP間進(jìn)程如何通信,PHP相關(guān)的服務(wù)的IPC是實現(xiàn)方式,IPC的思想如何用到項目中。 一、linux進(jìn)程間通信 理解php間進(jìn)程通信機(jī)制,先了解...
摘要:接受不到消息消息隊列通過指定而被創(chuàng)建后,任意一方銷毀了該隊列,都會導(dǎo)致其他發(fā)送或接收方失敗。用法場景進(jìn)程,中代碼段要用到中代碼段的結(jié)果。完成了進(jìn)程間同步問題此外進(jìn)程間通信采用的方式是共享內(nèi)存。 參考文章 深刻理解Linux進(jìn)程間通信(IPC) 進(jìn)程間通信(IPC)介紹 php高級應(yīng)用之進(jìn)程控制及進(jìn)程間通訊 workman 作者發(fā)布 PHP 相關(guān)進(jìn)程間通信擴(kuò)展 -- System V ...
摘要:多進(jìn)程通信之一命名管道。多進(jìn)程通信之三信號量與共享內(nèi)存。共享內(nèi)存是最快是進(jìn)程間通信方式,因為個進(jìn)程之間并不需要數(shù)據(jù)復(fù)制,而是直接操控同一份數(shù)據(jù)。的一些書籍中甚至不建議新手輕易使用這種進(jìn)程間通信的方式,因為這是一種極易產(chǎn)生死鎖的解決方案。 [原文地址:https://blog.ti-node.com/blog...] 往往開啟多進(jìn)程的目的是為了一起干活加速效率,前面說了不同進(jìn)程之間的內(nèi)存...
摘要:擴(kuò)展完成兼容機(jī)通用如獲取進(jìn)程殺死進(jìn)程等。擴(kuò)展實現(xiàn)方式的進(jìn)程間通信之消息隊列。四進(jìn)程間通信通常中的進(jìn)程通信方式有消息隊列信號量共享內(nèi)存信號管道。下面這個例子中,父進(jìn)程等待秒鐘,向子進(jìn)程發(fā)送信號。子進(jìn)程捕獲信號,掉信號處理函數(shù)處理。 一、引言 進(jìn)程是一個具有獨立功能的程序關(guān)于某個數(shù)據(jù)集合的一次運行活動。換句話說就是,在系統(tǒng)調(diào)度多個cpu的時候,一個程序的基本單元。進(jìn)程對于大多數(shù)的語言都不是...
閱讀 2447·2021-10-09 09:41
閱讀 3306·2021-09-26 09:46
閱讀 890·2021-09-03 10:34
閱讀 3230·2021-08-11 11:22
閱讀 3420·2019-08-30 14:12
閱讀 766·2019-08-26 11:34
閱讀 3382·2019-08-26 11:00
閱讀 1827·2019-08-26 10:26