日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

PHP進(jìn)程間通信的幾種方法詳解

瀏覽:28日期:2022-06-14 09:28:19
目錄管道通信PIPE消息隊(duì)列信號(hào)量與共享內(nèi)存管道通信PIPE

管道用于承載簡(jiǎn)稱(chēng)之間的通訊數(shù)據(jù)。為了方便理解,可以將管道比作文件,進(jìn)程A將數(shù)據(jù)寫(xiě)到管道P中,然后進(jìn)程B從管道P中讀取數(shù)據(jù)。php提供的管道操作API與操作文件的API基本一樣,除了創(chuàng)建管道使用posix_mkfifo函數(shù),讀寫(xiě)等操作均與文件操作函數(shù)相同。當(dāng)然,你可以直接使用文件模擬管道,但是那樣無(wú)法使用管道的特性了。

通過(guò)管道通信的大概思路是,首先創(chuàng)建一個(gè)管道,然后子進(jìn)程向管道中寫(xiě)入信息,父進(jìn)程從管道中讀取信息,這樣就可以做到父子進(jìn)程直接實(shí)現(xiàn)通信了。

<?php// 創(chuàng)建管道$pipePath = 'pipe';if( !file_exists( $pipePath ) ){ if( !posix_mkfifo( $pipePath, 0666) ){exit('make pipe false!' . PHP_EOL); }}// 創(chuàng)建進(jìn)程,子進(jìn)程寫(xiě)管道,父進(jìn)程讀管道// 通過(guò) pcntl_fork函數(shù)創(chuàng)建一個(gè)子進(jìn)程。// pcntl_fork 函數(shù) 很特殊,它調(diào)用一次擁有 多個(gè)返回值。// 在父進(jìn)程中:它返回 子進(jìn)程的ID 這個(gè)值是 大于0 的。// 在子進(jìn)程中,它返回0。當(dāng)返回 -1 時(shí)表示創(chuàng)建進(jìn)程失敗。$pid = pcntl_fork();if( $pid == 0 ){ // 子進(jìn)程寫(xiě)管道 $file = fopen( $pipePath, 'w'); fwrite( $file, 'hello world'); sleep(1); exit;}else{ // 父進(jìn)程讀管道 $file = fopen( $pipePath, 'r'); // 設(shè)置成讀取非阻塞 // 當(dāng)讀取是非阻塞的情況下,父進(jìn)程進(jìn)行讀取信息的時(shí)候不會(huì)等待, // 管道中沒(méi)有消息也會(huì)立馬返回。 // stream_set_blocking( $file, False); echo fread( $file, 20) . PHP_EOL; pcntl_wait($status); // 回收子進(jìn)程}消息隊(duì)列

消息隊(duì)列是存放在內(nèi)存中的一種隊(duì)列數(shù)據(jù)結(jié)構(gòu)。

<?php// 獲取父進(jìn)程id$parentPid = posix_getpid();echo 'parent progress pid:{$parentPid}\n';$childList = array();// 創(chuàng)建消息隊(duì)列,定義消息類(lèi)型$id = ftok(__FILE__, 'm');$msgQueue = msg_get_queue($id);const MSG_TYEP = 1;// 生產(chǎn)者function producer(){ global $msgQueue; $pid = posix_getpid(); $repeatNum = 5; for ($i = 0; $i <= $repeatNum; $i++) {$str = '({$pid}) progress create! {$i}';msg_send($msgQueue, MSG_TYEP, $str);$rand = rand(1, 3);sleep($rand); }}// 消費(fèi)者function consumer(){ global $msgQueue; $pid = posix_getpid(); $repeatNum = 6; for ($i = 1; $i<= $repeatNum; $i++) {$rel = msg_receive($msgQueue, MSG_TYEP, $msgType, 1024, $message);echo '{$message} | consumer({$pid}) destroy \n';$rand = rand(1, 3);sleep($rand); }}function createProgress($callback){ $pid = pcntl_fork(); if ($pid == -1) {// 創(chuàng)建失敗exit('fork progresses error\n'); } elseif ($pid == 0) {// 子進(jìn)程執(zhí)行程序$pid = posix_getpid();$callback();exit('({$pid})child progress end!\n'); } else {// 父進(jìn)程return $pid; }}for ($i = 0; $i < 3; $i++) { $pid = createProgress('producer'); $childList[$pid] = 1; echo 'create producer progresses: {$pid}\n';}for ($i = 0; $i < 2; $i++) { $pid = createProgress('consumer'); $childList[$pid] = 1; echo 'create consumer progresses: {$pid}\n';}while (!empty($childList)) { $childPid = pcntl_wait($status); if ($childPid > 0) {unset($childList[$childPid]); }}echo '({$parentPid})main progress end!\n';

運(yùn)行結(jié)果:

create producer progresses: 21432create producer progresses: 21433create producer progresses: 21434create consumer progresses: 21435(21426) progress create! 2 | consumer(21435) destroy(21424) progress create! 1 | consumer(21436) destroycreate 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!

信號(hào)量與共享內(nèi)存<?php$parentPid = posix_getpid();echo 'parent progress pid:{$parentPid}\n';// 創(chuàng)建共享內(nèi)存,創(chuàng)建信號(hào)量,定義共享key// ftok(文件路徑,資源標(biāo)識(shí)符) 創(chuàng)建一個(gè)IPC通信所需的id$shm_id = ftok(__FILE__, 'm');$shm_id = ftok(__FILE__, 's');// shm_attach(id) 創(chuàng)建或者打開(kāi)一個(gè)共享內(nèi)存$shareMemory = shm_attach($shm_id);// 返回一個(gè)可用戶訪問(wèn)系統(tǒng)信號(hào)量的id$signal = sem_get($shm_id);const SHARE_KEY = 1;// 生產(chǎn)者function producer() { global $shareMemory; global $signal; $pid = posix_getpid(); $repeatNum = 5; for ($i = 1; $i <= $repeatNum; $i++) {// 獲得信號(hào)量 - 阻塞進(jìn)程,直到信號(hào)量被獲取到[lock鎖機(jī)制的關(guān)鍵]sem_acquire($signal);// 檢查某個(gè)key是否存在與共享內(nèi)存中if (shm_has_var($shareMemory, SHARE_KEY)) { // 獲取共享內(nèi)存中的key的值 $count = shm_get_var($shareMemory, SHARE_KEY); $count ++; // 為共享內(nèi)存中的key賦值 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); }}function createProgress($callback) { $pid = pcntl_fork(); if ($pid == -1) {// 創(chuàng)建失敗exit('fork progress error!\n'); } elseif ($pid == 0) {// 子進(jìn)程$pid = posix_getpid();$callback();exit('({$pid}) child progress end!\n'); } else {// 父進(jìn)程return $pid; }}// 3個(gè)寫(xiě)進(jìn)程for ($i = 0; $i < 3; $i ++) { $pid = createProgress('producer'); $childList[$pid] = 1; echo 'create producer child progress: {$pid} \n';}// 等待所有子進(jìn)程while (!empty($childList)) { $childPid = pcntl_wait($status); if ($childPid > 0) {unset($childList[$childPid]); }}// 釋放共享內(nèi)存與信號(hào)量shm_remove($shareMemory);sem_remove($signal);echo '({$parentPid}) main progress end!\n';

運(yùn)行結(jié)果:

使用信號(hào)量來(lái)實(shí)現(xiàn)共享內(nèi)存的鎖機(jī)制

parent progress pid:31720create 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!

無(wú)鎖情況

Warning: sem_release(): SysV semaphore 4357894312 (key 0x73048925) is not currently acquired in /Users/easyboom/www/example/信號(hào)量與共享內(nèi)存.php on line 38

以上就是PHP進(jìn)程間通信的幾種方法詳解的詳細(xì)內(nèi)容,更多關(guān)于PHP進(jìn)程間通信的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: PHP
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
蜜桃av.网站在线观看| 精品国产一区二区三区av片| 岛国av免费在线观看| 欧美激情麻豆| 国产suv精品一区| 在线一区视频观看| 日韩午夜av在线| 亚洲3区在线| 国产精品久久久久久久久久久久久久久 | 日本大胆欧美人术艺术动态| 丝袜诱惑制服诱惑色一区在线观看 | 国产探花一区在线观看| 欧美亚洲网站| jizzjizz中国精品麻豆| 激情欧美丁香| 日韩高清三区| 中文字幕高清在线播放| 999在线观看精品免费不卡网站| 亚洲精品美女| 日韩av二区| 日韩亚洲在线| 久久精品xxxxx| 伊人久久在线| 久久高清国产| 精品视频91| 亚洲男女av一区二区| 免费精品视频| 国产欧美一区二区三区国产幕精品| 久久av影视| 久久久国产精品一区二区中文| 午夜久久av| 麻豆视频在线观看免费网站黄| 国产欧美日韩精品一区二区免费| 青青国产精品| 亚洲精品国产精品粉嫩| 一级成人国产| 蜜桃久久av一区| 久久精品国产www456c0m| 久久国产精品美女| 精品久久亚洲| 婷婷精品视频| 蜜臀91精品一区二区三区| 国产一区欧美| 国产精品99免费看| 亚洲2区在线| 亚洲涩涩在线| 亚洲丝袜啪啪| 蜜臀va亚洲va欧美va天堂 | 亚洲精品影视| 99视频精品| 综合一区av| 成人免费一区| 亚洲一级在线| 日本va欧美va精品发布| 久久永久免费| 蜜臀av在线播放一区二区三区| 精品伊人久久久| 亚洲毛片在线| 99国产精品99久久久久久粉嫩| 亚洲欧美日韩精品一区二区 | 国产乱码精品| 国产欧美日韩| 日韩在线一区二区| 国产精品亚洲人成在99www| 不卡专区在线| 日韩中出av| 国产在线成人| 鲁大师精品99久久久| 免费人成网站在线观看欧美高清| 麻豆视频一区二区| 亚洲精品日本| 宅男在线一区| 久久久久亚洲精品中文字幕| 综合一区av| 免费精品国产的网站免费观看| 久久精品色播| 日韩激情网站| 日韩在线一二三区| 国产白浆在线免费观看| 日韩国产在线一| 在线 亚洲欧美在线综合一区| 麻豆成全视频免费观看在线看| 国产精品毛片久久久| 日本一区免费网站| 蜜臀av一区二区在线免费观看 | 亚洲综合精品| 欧美a级一区| 欧美三区四区| 亚洲国产福利| 日韩av免费大片| 另类小说一区二区三区| 久久夜色精品| 伊人成人网在线看| 天堂资源在线亚洲| 99成人在线视频| 99视频精品全部免费在线视频| 92国产精品| 欧美三区四区| 日韩中文影院| 成人欧美一区二区三区的电影| 国产66精品| 精品国产不卡一区二区| 国产一区二区三区四区五区| 久久免费影院| 欧美激情三区| 国内精品伊人| 麻豆一区二区在线| 久久av影视| 成人国产精品| 亚洲性色av| 女同性一区二区三区人了人一| 好吊日精品视频| 蜜芽一区二区三区| 日韩一区电影| 三级小说欧洲区亚洲区| 日本久久二区| 日韩在线网址| 国模精品一区| 无码日韩精品一区二区免费| 国产精品日本一区二区不卡视频| 日韩深夜视频| 亚洲视频电影在线| 日本不卡免费高清视频在线| 欧美aⅴ一区二区三区视频| 亚洲精品一二| 国产日产一区| 久久免费影院| 丝袜美腿诱惑一区二区三区| 欧美成人久久| 在线观看视频免费一区二区三区| 日韩精品五月天| 久久亚州av| 视频一区中文| 日韩一区免费| 精品国产精品久久一区免费式| 日韩在线不卡| 夜夜嗨一区二区三区| 性欧美精品高清| 国产精品亚洲四区在线观看| 日韩在线观看一区| 综合亚洲自拍| 三上亚洲一区二区| 亚洲欧美网站| 丰满少妇一区| 老色鬼久久亚洲一区二区| 欧美在线黄色| 四虎4545www国产精品| 精品一区二区三区的国产在线观看| 久久青青视频| 欧美激情91| 中文字幕系列一区| 久久精品播放| a国产在线视频| 亚洲精品一区二区妖精| 国产一区亚洲| 91成人超碰| 中文字幕一区二区精品区| 欧美亚洲一区二区三区| 国产日韩一区| 日韩午夜av在线| 国产日韩一区二区三区在线| 中文在线а√在线8| 视频一区视频二区中文| 久久99精品久久久久久园产越南| 久久国产电影| 欧美日韩一视频区二区| 99精品视频在线观看免费播放| 国产亚洲一级| 精品久久久亚洲| 蜜桃久久久久久久| 午夜av成人| 国产欧美日韩| 亚洲欧美日韩精品一区二区| 国产精品天天看天天狠| 国产欧美一区二区三区精品酒店 | 伊人久久亚洲热| 在线免费观看亚洲| 日韩一区电影| 91精品一区| 国产一区91| 黄色aa久久| 欧美另类中文字幕| 亚洲欧美在线综合| 女人av一区| 亚洲一级高清| 国产99久久久国产精品成人免费| 亚洲精品少妇| 九九久久国产| 日韩精品免费一区二区在线观看| 一区二区三区午夜视频| 伊人久久婷婷| 国产精品试看| 日韩在线一二三区| 日韩精品亚洲一区二区三区免费| 色一区二区三区四区| 99在线精品视频在线观看| 综合亚洲视频| 免费观看亚洲| 精品国产一区二区三区性色av| 日本vs亚洲vs韩国一区三区二区|