电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

PHP進程間通信的幾種方法詳解

瀏覽:12日期:2022-06-14 09:28:19
目錄管道通信PIPE消息隊列信號量與共享內存管道通信PIPE

管道用于承載簡稱之間的通訊數據。為了方便理解,可以將管道比作文件,進程A將數據寫到管道P中,然后進程B從管道P中讀取數據。php提供的管道操作API與操作文件的API基本一樣,除了創建管道使用posix_mkfifo函數,讀寫等操作均與文件操作函數相同。當然,你可以直接使用文件模擬管道,但是那樣無法使用管道的特性了。

通過管道通信的大概思路是,首先創建一個管道,然后子進程向管道中寫入信息,父進程從管道中讀取信息,這樣就可以做到父子進程直接實現通信了。

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

消息隊列是存放在內存中的一種隊列數據結構。

<?php// 獲取父進程id$parentPid = posix_getpid();echo 'parent progress pid:{$parentPid}\n';$childList = array();// 創建消息隊列,定義消息類型$id = ftok(__FILE__, 'm');$msgQueue = msg_get_queue($id);const MSG_TYEP = 1;// 生產者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); }}// 消費者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) {// 創建失敗exit('fork progresses error\n'); } elseif ($pid == 0) {// 子進程執行程序$pid = posix_getpid();$callback();exit('({$pid})child progress end!\n'); } else {// 父進程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';

運行結果:

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!

信號量與共享內存<?php$parentPid = posix_getpid();echo 'parent progress pid:{$parentPid}\n';// 創建共享內存,創建信號量,定義共享key// ftok(文件路徑,資源標識符) 創建一個IPC通信所需的id$shm_id = ftok(__FILE__, 'm');$shm_id = ftok(__FILE__, 's');// shm_attach(id) 創建或者打開一個共享內存$shareMemory = shm_attach($shm_id);// 返回一個可用戶訪問系統信號量的id$signal = sem_get($shm_id);const SHARE_KEY = 1;// 生產者function producer() { global $shareMemory; global $signal; $pid = posix_getpid(); $repeatNum = 5; for ($i = 1; $i <= $repeatNum; $i++) {// 獲得信號量 - 阻塞進程,直到信號量被獲取到[lock鎖機制的關鍵]sem_acquire($signal);// 檢查某個key是否存在與共享內存中if (shm_has_var($shareMemory, SHARE_KEY)) { // 獲取共享內存中的key的值 $count = shm_get_var($shareMemory, SHARE_KEY); $count ++; // 為共享內存中的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) {// 創建失敗exit('fork progress error!\n'); } elseif ($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';

運行結果:

使用信號量來實現共享內存的鎖機制

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!

無鎖情況

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

以上就是PHP進程間通信的幾種方法詳解的詳細內容,更多關于PHP進程間通信的資料請關注好吧啦網其它相關文章!

標簽: PHP
相關文章:
主站蜘蛛池模板: 食药成分检测_调料配方还原_洗涤剂化学成分分析_饲料_百检信息科技有限公司 | 便携式谷丙转氨酶检测仪|华图生物科技百科 | 东莞爱加真空科技有限公司-进口真空镀膜机|真空镀膜设备|Polycold维修厂家 | 好杂志网-首页 | 高效复合碳源-多核碳源生产厂家-污水处理反硝化菌种一长隆科技库巴鲁 | 番茄畅听邀请码怎么输入 - Dianw8.com | 储气罐,真空罐,缓冲罐,隔膜气压罐厂家批发价格,空压机储气罐规格型号-上海申容压力容器集团有限公司 | 酶联免疫分析仪-多管旋涡混合仪|混合器-莱普特科学仪器(北京)有限公司 | 视频教程导航网_视频教程之家_视频教程大全_最新视频教程分享发布平台 | 济南轻型钢结构/济南铁艺护栏/济南铁艺大门-济南燕翔铁艺制品有限公司 | 北京网站建设公司_北京网站制作公司_北京网站设计公司-北京爱品特网站建站公司 | 江苏农村商业银行招聘网_2024江苏农商行考试指南_江苏农商行校园招聘 | 磁力链接搜索神器_BT磁力狗_CILIMAO磁力猫_高效磁力搜索引擎2024 | 飞扬动力官网-广告公司管理软件,广告公司管理系统,喷绘写真条幅制作管理软件,广告公司ERP系统 | 刘秘书_你身边专业的工作范文写作小秘书| 洗瓶机厂家-酒瓶玻璃瓶冲瓶机-瓶子烘干机-封口旋盖压盖打塞机_青州惠联灌装机械 | 陕西安玻璃自动感应门-自动重叠门-磁悬浮平开门厂家【捷申达门业】 | 维泰克Veertek-锂电池微短路检测_锂电池腐蚀检测_锂电池漏液检测 | 回收二手冲床_金丰旧冲床回收_协易冲床回收 - 大鑫机械设备 | 蒜肠网-动漫,二次元,COSPLAY,漫展以及收藏型模型,手办,玩具的新媒体.(原变形金刚变迷TF圈) | 烟台条码打印机_烟台条码扫描器_烟台碳带_烟台数据采集终端_烟台斑马打印机-金鹏电子-金鹏电子 | 奇酷教育-Python培训|UI培训|WEB大前端培训|Unity3D培训|HTML5培训|人工智能培训|JAVA开发的教育品牌 | 超声骨密度仪,双能X射线骨密度仪【起草单位】,骨密度检测仪厂家 - 品源医疗(江苏)有限公司 | 知名电动蝶阀,电动球阀,气动蝶阀,气动球阀生产厂家|价格透明-【固菲阀门官网】 | 北京宣传片拍摄_产品宣传片拍摄_宣传片制作公司-现像传媒 | 广东泵阀展|阀门展-广东国际泵管阀展览会 | 西门子伺服控制器维修-伺服驱动放大器-828D数控机床维修-上海涌迪 | 合肥弱电工程_安徽安防工程_智能化工程公司-合肥雷润 | 河南包装袋厂家_河南真空袋批发价格_河南服装袋定制-恒源达包装制品 | 致胜管家软件服务【在线免费体验】| 铣床|万能铣床|立式铣床|数控铣床|山东滕州万友机床有限公司 | 搅拌磨|搅拌球磨机|循环磨|循环球磨机-无锡市少宏粉体科技有限公司 | LED显示屏_LED屏方案设计精准报价专业安装丨四川诺显科技 | 异噻唑啉酮-均三嗪-三丹油-1227-中北杀菌剂厂家 | 硬度计,金相磨抛机_厂家-莱州华煜众信试验仪器有限公司 | 伸缩节_伸缩器_传力接头_伸缩接头_巩义市联通管道厂 | 亚克力制品定制,上海嘉定有机玻璃加工制作生产厂家—官网 | 【电子厂招聘_普工招工网_工厂招聘信息平台】-工立方打工网 | 上海小程序开发-小程序制作-上海小程序定制开发公司-微信商城小程序-上海咏熠 | 中式装修设计_全屋定制家具_实木仿古门窗花格厂家-喜迎门 | 水冷式工业冷水机组_风冷式工业冷水机_水冷螺杆冷冻机组-深圳市普威机械设备有限公司 |