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

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

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

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

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

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

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

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

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

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

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

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

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

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

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

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