php管線通訊
本人部落格:http://www.cnblogs.com/nickbai/
本人GitHub:https://github.com/nick-bai
php進(jìn)行進(jìn)程間通訊的方式有好幾種:訊息隊(duì)列,管道,共享內(nèi)存,socket,信號(hào)。本文介紹的是透過(guò)有名管道的方式?! ?br>
管道PIPE
管道用於承載簡(jiǎn)稱之間的通訊資料。為了方便理解,可以將管道比喻為文件,進(jìn)程A將資料寫(xiě)到管道P中,然後進(jìn)程B從管道P中讀取資料。 php提供的管道操作API與操作文件的API基本上一樣,除了建立管道使用posix_mkfifo函數(shù),讀寫(xiě)等操作都與檔案操作函數(shù)相同。當(dāng)然,你可以直接使用檔案模擬管道,但是那樣無(wú)法使用管道的特性了。
透過(guò)管道通訊的大概思路是,首先創(chuàng)建一個(gè)管道,然後子進(jìn)程向管道中寫(xiě)入信息,父進(jìn)程從管道中讀取信息,這樣就可以做到父子進(jìn)程直接實(shí)現(xiàn)通信了。 <?php <br/>/**<br>?*?author:?NickBai<br>?*?createTime:?2016/12/2?0002?上午?11:12<br>?*/<br>//建立管道<br>$pipePath?=?"/tmp/test.pipe";<br>if(?!file_exists(?$pipePath??){<br>?p. ,?0666?)?){<br>????????exit('make?pipe?false!'?.?PHP_EOL);<br>????}<}<br>}<br>處理程序();<br><br>if( $pid?==?0?){<br>????//子程序?qū)懭牍艿?lt;br>????$file?=?fopen(?$pipePath,?'w'?);<br>??1); <br>????exit() ;<br>}else{<br>????//父程式讀取管道<br>????$file?=?fopen(?$pipePath,?'r'?);<br>???//stream_set_blocking(F1file)<br>?echo?fread(?$ file,?20?)?.?PHP_EOL;<br><br>????pcntl_wait($status);??//回收子程序<br>}<br> ? ? ?<br>在:本程式碼時(shí)只能於<br>
第7行:指定一個(gè)管道的路徑,這裡跟普通文件沒(méi)什麼區(qū)別。 第9行:透過(guò) posix_mkfifo 函數(shù)建立 管道 並且設(shè)定讀寫(xiě)權(quán)限為 0666
第15行:透過(guò) pcntl_fork函數(shù)建立一個(gè)子程序。注意從現(xiàn)在開(kāi)始,程式將會(huì)被分成兩個(gè)流程來(lái)執(zhí)行。 pcntl_fork 函數(shù) 很特殊,它呼叫一次擁有 多個(gè)回傳值。在父進(jìn)程中:它回傳 子進(jìn)程的ID 這個(gè)值是 大於0 的。在子進(jìn)程中,它回傳0。當(dāng)傳回 -1 時(shí)表示建立進(jìn)程失敗。
? 第17行:兩個(gè)進(jìn)程依目前進(jìn)程所獲得的$pid的值不同,而進(jìn)入不同的分支。
?第18~22行:子進(jìn)程打開(kāi)管道,並向其中寫(xiě)入hello world ,然後進(jìn)入休眠,休眠結(jié)束之後,退出。
?第25~29行:父進(jìn)程開(kāi)啟管道,並進(jìn)行讀取,最後執(zhí)行 29行的程式碼回收掉子進(jìn)程。這裡面兩個(gè)地方是阻塞的,首先是預(yù)設(shè)讀的地方,要等待子程序發(fā)出exit指令之後,才能回傳資料。還有就是回收進(jìn)程的 pcntl_wait方法。要等到進(jìn)程退出。
?在linux 下運(yùn)行程式碼:
會(huì)看到程式阻塞 1秒 之後,輸出 hello world。 當(dāng)我們打開(kāi)第26 行程式碼,並將27行改為var_dump(fread( $file, 20 )) . PHP_EOL; 時(shí),運(yùn)行程式:
能看到程式立刻輸出中之後退出。這是因?yàn)?。?dāng)讀取是非阻塞的情況下,父進(jìn)程進(jìn)行讀取訊息的時(shí)候,不會(huì)等待立刻有訊息,管道中沒(méi)有訊息,也會(huì)立刻回傳。然後執(zhí)行到 29行回收子程序的時(shí)候,阻塞等待子程序退出後結(jié)束。 下面來(lái)看一個(gè)簡(jiǎn)單的實(shí)際小例子。兩個(gè)子進(jìn)程向一個(gè)檔案寫(xiě)訊息,父進(jìn)程負(fù)責(zé)監(jiān)聽(tīng)偵測(cè)這個(gè)檔案是否寫(xiě)入完成,完成之後,講這個(gè)檔案copy一份。這裡,父子進(jìn)程之間透過(guò)管道通信,確認(rèn)是否完成寫(xiě)入。
/**
?*?author:?NickBai?*?createTime:?2016/12/2?0002?下午?2:00<br>?*/<br>//建立管道<br>$pipePath?=?"/tmp/test.pipe";<br>if(?!file_exists(?$pipePath?)?){<br>????if(?!posix_mkfifo(?$pipePath,?0666?)?){??); }<br>}<br><br>//建立兩個(gè)子程序?qū)懭霗n案<br>for (?$i?=?0;?$i?<br>????$pid?=?pcntl_fork(); './pipe.log',?$i?.?"?write pipen",?FILE_APPEND?);??//寫(xiě)入檔案<br>????????$file?=?fopen(?$pipePath,?'w'?); /向管道中寫(xiě)標(biāo)識(shí),標(biāo)識(shí)寫(xiě)入完畢。 <br>????????fclose(?$file?);<br>????????exit();??//退出子程序<br>????exit();??//退出子程序<br>???完<br>//2、拷貝寫(xiě)好的文件<br>//3、刪除管道<br>//4、回收程序<br><br>$file?=?fopen(?$pipePath,?'r'?);<br>$line?=?0 ){<br>????$end?=?fread(?$file,?1024?);<br>????foreach(?str_split(?$end?)?as?==$c)H <br>????????????$line++;<br>????????}<br>????}<br>?(?$line?==?2?){<br>????????copy(?'./pipe.log',?'./pipe_copy.log'?);?????$pipePath?);<br>????????pcntl_wait(?$status?);<br> exit("ok?n");<br>????}<br>}<br><br><br><br><br>
<br>

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門(mén)文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)

熱門(mén)話題

《Go語(yǔ)言程式設(shè)計(jì)實(shí)例:Web開(kāi)發(fā)中的程式碼範(fàn)例》隨著網(wǎng)路的快速發(fā)展,Web開(kāi)發(fā)已成為各行業(yè)中不可或缺的一部分。作為一門(mén)功能強(qiáng)大且效能優(yōu)越的程式語(yǔ)言,Go語(yǔ)言在Web開(kāi)發(fā)中越來(lái)越受到開(kāi)發(fā)者們的青睞。本文將透過(guò)具體的程式碼範(fàn)例,介紹如何利用Go語(yǔ)言進(jìn)行Web開(kāi)發(fā),讓讀者更能理解並運(yùn)用Go語(yǔ)言來(lái)建立自己的Web應(yīng)用。 1.簡(jiǎn)單的HTTP伺服器首先,讓我們從一個(gè)

華為雲(yún)端邊緣運(yùn)算對(duì)接指南:Java程式碼範(fàn)例快速實(shí)現(xiàn)介面隨著物聯(lián)網(wǎng)技術(shù)的快速發(fā)展和邊緣運(yùn)算的興起,越來(lái)越多的企業(yè)開(kāi)始關(guān)注邊緣運(yùn)算的應(yīng)用。華為雲(yún)端提供了邊緣運(yùn)算服務(wù),為企業(yè)提供了高可靠的運(yùn)算資源和便利的開(kāi)發(fā)環(huán)境,使得邊緣運(yùn)算應(yīng)用更容易實(shí)現(xiàn)。本文將介紹如何透過(guò)Java程式碼快速實(shí)現(xiàn)華為雲(yún)端邊緣運(yùn)算的介面。首先,我們需要準(zhǔn)備好開(kāi)發(fā)環(huán)境。確保你已經(jīng)安裝了Java開(kāi)發(fā)工具包(

了解Python程式設(shè)計(jì)的入門(mén)程式碼範(fàn)例Python是一種簡(jiǎn)單易學(xué),功能強(qiáng)大的程式語(yǔ)言。對(duì)於初學(xué)者來(lái)說(shuō),了解Python程式設(shè)計(jì)的入門(mén)級(jí)程式碼範(fàn)例是非常重要的。本文將為您提供一些具體的程式碼範(fàn)例,幫助您快速入門(mén)。列印HelloWorldprint("HelloWorld")這是Python中最簡(jiǎn)單的程式碼範(fàn)例。 print()函數(shù)用於將指定的內(nèi)容輸出

Java冒泡排序最簡(jiǎn)單的程式碼範(fàn)例冒泡排序是一種常見(jiàn)的排序演算法,它的基本想法是透過(guò)相鄰元素的比較和交換來(lái)將待排序序列逐步調(diào)整為有序序列。以下是一個(gè)簡(jiǎn)單的Java程式碼範(fàn)例,示範(fàn)如何實(shí)作冒泡排序:publicclassBubbleSort{publicstaticvoidbubbleSort(int[]arr){int

PHP變數(shù)儲(chǔ)存程式運(yùn)行期間的值,對(duì)於建立動(dòng)態(tài)且互動(dòng)的WEB應(yīng)用程式至關(guān)重要。本文將深入探討php變量,並透過(guò)10個(gè)真實(shí)的範(fàn)例展示它們的實(shí)際應(yīng)用。 1.儲(chǔ)存使用者輸入$username=$_POST["username"];$passWord=$_POST["password"];此範(fàn)例從表單提交中提取使用者名稱和密碼,並將其儲(chǔ)存在變數(shù)中以供進(jìn)一步處理。 2.設(shè)定配置值$database_host="localhost";$database_username="username";$database_pa

如何使用PHP編寫(xiě)庫(kù)存管理系統(tǒng)中的庫(kù)存分倉(cāng)管理功能碼庫(kù)存管理是許多企業(yè)中不可或缺的一部分。對(duì)於擁有多個(gè)倉(cāng)庫(kù)的企業(yè)來(lái)說(shuō),庫(kù)存分倉(cāng)管理功能尤其重要。透過(guò)合理管理和追蹤庫(kù)存,企業(yè)可以實(shí)現(xiàn)不同倉(cāng)庫(kù)之間的庫(kù)存調(diào)撥,優(yōu)化營(yíng)運(yùn)成本,改善協(xié)同效率。本文將介紹如何使用PHP編寫(xiě)庫(kù)存分倉(cāng)管理功能的程式碼,並為您提供相關(guān)的程式碼範(fàn)例。一、建立資料庫(kù)在開(kāi)始編寫(xiě)庫(kù)存分倉(cāng)管理功能的程式碼之

標(biāo)題:從入門(mén)到精通:Go語(yǔ)言中常用資料結(jié)構(gòu)的程式碼實(shí)作資料結(jié)構(gòu)在程式設(shè)計(jì)中起著至關(guān)重要的作用,它是程式設(shè)計(jì)的基礎(chǔ)。在Go語(yǔ)言中,有許多常用的資料結(jié)構(gòu),掌握這些資料結(jié)構(gòu)的實(shí)作方式對(duì)於成為優(yōu)秀的程式設(shè)計(jì)師至關(guān)重要。本文將介紹Go語(yǔ)言中常用的資料結(jié)構(gòu),並給出對(duì)應(yīng)的程式碼範(fàn)例,幫助讀者從入門(mén)到精通這些資料結(jié)構(gòu)。 1.數(shù)組(Array)數(shù)組是一種基本的資料結(jié)構(gòu),是一組相同類型

Java選擇排序法程式碼編寫(xiě)指南及範(fàn)例選擇排序是一種簡(jiǎn)單直觀的排序演算法,其想法是每次從未排序的元素中選擇最小(或最大)的元素進(jìn)行交換,直到所有元素排序完成。本文將提供選擇排序的程式碼編寫(xiě)指南,並附上具體的Java範(fàn)例程式碼。演算法原理選擇排序的基本原理是將待排序數(shù)組分為已排序和未排序兩部分,每次從未排序部分選擇最?。ɑ蜃畲螅┑脑?,將其放到已排序部分的末尾。重複上述
