php管道通信
本人博客:http://www.cnblogs.com/nickbai/
本人GitHub:https://github.com/nick-bai
php进行进程间通信的方式有好几种:消息队列,管道,共享内存,socket,信号。本文介绍的是通过有名管道的方式。
管道PIPE
管道用于承载简称之间的通讯数据。为了方便理解,可以将管道比作文件,进程A将数据写到管道P中,然后进程B从管道P中读取数据。php提供的管道操作API与操作文件的API基本一样,除了创建管道使用posix_mkfifo函数,读写等操作均与文件操作函数相同。当然,你可以直接使用文件模拟管道,但是那样无法使用管道的特性了。
通过管道通信的大概思路是,首先创建一个管道,然后子进程向管道中写入信息,父进程从管道中读取信息,这样就可以做到父子进程直接实现通信了。<?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> if( !posix_mkfifo( $pipePath, 0666 ) ){<br> exit('make pipe false!' . PHP_EOL);<br> }<br>}<br><br>//创建进程,子进程写管道,父进程读管道<br>$pid = pcntl_fork();<br><br>if( $pid == 0 ){<br> //子进程写管道<br> $file = fopen( $pipePath, 'w' );<br> fwrite( $file, 'hello world' );<br> sleep(1);<br> exit();<br>}else{<br> //父进程读管道<br> $file = fopen( $pipePath, 'r' );<br> //stream_set_blocking( $file, False ); //设置成读取非阻塞<br> echo fread( $file, 20 ) . PHP_EOL;<br><br> pcntl_wait($status); //回收子进程<br>}
注意:本代码只能在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方法。要等到进程退出。
在linux 下运行该代码:
会看到程序阻塞 1秒 之后,输出 hello world。
当我们打开 第 26 行代码,并将 27行改为 var_dump(fread( $file, 20 )) . PHP_EOL; 时,运行程序:
能看到程序立马输出 空串,并等待 1秒 中之后退出。这是因为。当读取是非阻塞的情况下,父进程进行读取信息的时候,不会等待立马有信息,管道中没有信息,也会立马返回。然后执行到 29行回收子进程的时候,阻塞等待子进程退出后结束。
下面来看一个简单的实际小例子。两个子进程向一个文件中写信息,父进程负责监听检测这个文件是否写入完成,完成之后,讲这个文件copy一份。这里,父子进程之间通过管道通信,确认是否完成写入。<?php<br>/**<br> * author: NickBai<br> * 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> exit("make pipe fail \n");<br> }<br>}<br><br>//创建两个子进程写文件<br>for( $i = 0; $i < 2; $i++ ){<br><br> $pid = pcntl_fork();<br> if( $pid == 0 ){<br> file_put_contents( './pipe.log', $i . " write pipe\n", FILE_APPEND ); //写入文件<br> $file = fopen( $pipePath, 'w' );<br> fwrite( $file, $i . "\n" ); //向管道中写标识,标识写入完毕。<br> fclose( $file );<br> exit(); //退出子进程<br> }<br>}<br><br>//父进程要做的是:<br>//1、读取管道中的写出状态,判断是否完全写完<br>//2、拷贝写好的文件<br>//3、删除管道<br>//4、回收进程<br><br>$file = fopen( $pipePath, 'r' );<br>$line = 0;<br>while(1){<br> $end = fread( $file, 1024 );<br> foreach( str_split( $end ) as $c) {<br> if ( "\n" == $c ) {<br> $line++;<br> }<br> }<br><br> if( $line == 2 ){<br> copy( './pipe.log', './pipe_copy.log' );<br> fclose( $file );<br> unlink( $pipePath );<br> pcntl_wait( $status );<br> exit("ok \n");<br> }<br>}

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

SecLists
SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

DVWA
Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini

Dreamweaver CS6
Alat pembangunan web visual

MinGW - GNU Minimalis untuk Windows
Projek ini dalam proses untuk dipindahkan ke osdn.net/projects/mingw, anda boleh terus mengikuti kami di sana. MinGW: Port Windows asli bagi GNU Compiler Collection (GCC), perpustakaan import yang boleh diedarkan secara bebas dan fail pengepala untuk membina aplikasi Windows asli termasuk sambungan kepada masa jalan MSVC untuk menyokong fungsi C99. Semua perisian MinGW boleh dijalankan pada platform Windows 64-bit.
