Swoole進程間通訊的方式
#管道pipe
##管道用於進程之間的數據交互,Linux系統本身提供了pipe函數用於創建一個半雙工通訊管道。半雙工的通訊方式中資料只能單向流動(一端只讀一端只寫),只能在具有親緣關係(父子進程)的進程之間使用。 (建議學習:swoole視訊教學)
管道是進程間通訊IPC中最基礎的方式,管道有兩種分別是命名管道、匿名管道。 匿名管道:專門用於具有血緣關係的進程之間,完成資料傳遞。命名管道:可以用在任何兩個流程之間,Swoole中的管道都是匿名管道。 在Swoole中利用eventfd和UnixSock封裝了兩種管道,使得進程之間的通訊更加靈活。Swoole的Process模組內建了管道的方式用於進程間通信,在建構Process實例時只要開啟了$pipe_type選項,Swoole底層會自動建立一個管道,這裡需要說明的時,雖然名字上叫做管道,但實際上在新版Swoole中底層通訊是透過UnixSock實現的,所以並不是真正意義上的Linux Pipe。
建立流程
swoole_process::__construct( callable $function, bool $redirect_stdin_stdout = false, int $pipe_type = SOCK_DGRAM, bool $enable_coroutine = false );
管道類型$pipe_type可分為三種:##0表示不建立管道
1表示創建SOCK_STREAM類型的管道
2表示創建SOCK_DGRAM類型的管道
當啟用$redirect_stdin_stdout後,$pipe_type選項將忽略用戶參數,強制為1。
管道描述符當進程被fork出來後,父進程和子進程中的Process物件會被設定上一個名為pipe的成員變量,存放著底層UnixSocket的描述符,父進程和子進程可以透過這個管道描述符來傳送數據,也可以直接呼叫Process提供的read/write介面來收發數據。
object(Swoole\Process)#1 (6) { ["pipe"]=>int(4) ["callback"]=>NULL ["msgQueueId"]=>NULL ["msgQueueKey"]=>NULL ["pid"]=>int(287) ["id"]=>NULL}管道讀寫
swoole_process->write(string $data) 在進程的管道中寫入資料
#swoole_process-> read(int $buffer_size = 8192) 從進程的管道讀取資料
以上是swoole進程間如何通信的詳細內容。更多資訊請關注PHP中文網其他相關文章!