本文枚举一个举行引见,那就是是经由过程著名管道的体式格局。
管道用于承载简称之间的通信数据。为了轻易明白,能够将管道比作文件,历程A将数据写到管道P中,然后历程B从管道P中读取数据。
php供应的管道操纵API与操纵文件的API基础一样,除了建立管道运用posix_mkfifo函数,读写等操纵均与文件操纵函数雷同。
固然,你能够直接运用文件模仿管道,然则那样没法运用管道的特征了。
经由过程管道通信的也许思绪是,起首建立一个管道,然后子历程向管道中写入信息,父历程从管道中读取信息,如许就能够做到父子历程直接完成通信了。
<?php /** * author: NickBai * createTime: 2016/12/2 0002 上午 11:12 */ //建立管道 $pipePath = "/tmp/test.pipe"; if( !file_exists( $pipePath ) ){ if( !posix_mkfifo( $pipePath, 0666 ) ){ exit('make pipe false!' . PHP_EOL); } } //建立历程,子历程写管道,父历程读管道 $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); //接纳子历程 }
注重:本代码只能在linux下运转,而且只能在php-cli形式下。
第7行:指定一个管道的途径,这里跟一般文件没什么区分。
第9行:经由过程 posix_mkfifo 函数建立 管道 而且设置读写权限为 0666
第15行:经由过程 pcntl_fork函数建立一个子历程。注重从现在开始,顺序将会被分红两个历程来实行。 pcntl_fork 函数 很特别,它挪用一次具有 多个返回值。在父历程中:它返回 子历程的ID 这个值是 大于0 的。在子历程中,它返回0。当返回 -1 时示意建立历程失利。
第17行:两个历程依据当前历程所取得的$pid的值差别,而进入差别的分支。
第18~22行:子历程翻开管道,并向个中写入hello world ,然后进入休眠,休眠完毕以后,退出。
第25~29行:父历程翻开管道,并举行读取,末了实行 29行的代码接纳掉子历程。这内里两个处所是壅塞的,起首是默认读的处所,要守候子历程发出exit敕令以后,才返回数据。另有就是接纳历程的 pcntl_wait要领。要比及历程退出。
以上就是php历程通信有几种体式格局的细致内容,更多请关注ki4网别的相干文章!