php管道邮件,php进程通信-PIPE管道通信
上一篇文章講到了php進程通信的進程信號通信方法,本文介紹的是有名管道:
管道通信,主要是利用文件,寫入以及讀取來進行通信的,
通俗來講,就是A進程在1.txt寫入1,B進程讀取1.txt,就能讀取到這個1,這樣就通信成功了.
當然,php進程管道通信沒有這么簡單
注意:多進程系列文章,都建立在linux環境,php-cli運行模式下
一:創建個專屬管道的文件:$fifoPath?=?"tmp/$name".getmypid()?;//定義文件名
if?(!file_exists($fifoPath))?{
if?(!posix_mkfifo($fifoPath,?0666))?{//posix函數,創建一個特殊的pipe文件
//????????????????error("create?new?pipe?($name)?error.");
return?false;
}
}?else?{
//????????????error("pipe?($name)?has?exit.");
return?false;
}
二:讀取數據$r_pipe?=?fopen($fifoPath,?'r');//正常讀取文件
if?($r_pipe?==?NULL)?{
return?false;
}
$data?=?fread($r_pipe,?1024);
三:寫入數據$w_pipe?=?fopen($fifoPath,?'w');//正常操作文件一樣打開該管道
if?($w_pipe?==?NULL)?{
throw?new?Exception('打開管道錯誤!');
}
$result?=?fwrite($w_pipe,?$data);//寫入文件一樣寫入數據
四:刪除管道unlink($tfifoPath);//刪除文件
五:封裝類<?php
/**
*?Created?by?PhpStorm.
*?User:?tioncico
*?Date:?18-5-21
*?Time:?下午11:51
*/
class?Pipe
{
public?$fifoPath;
private?$w_pipe;
private?$r_pipe;
/**
*?自動創建一個管道
*
*?@param?string?$name?管道名字
*?@param?int?$mode?管道的權限,默認任何用戶組可以讀寫
*/
function?__construct($name?=?'pipe',?$mode?=?0666)
{
$fifoPath?=?"tmp/$name".getmypid()?;
if?(!file_exists($fifoPath))?{
if?(!posix_mkfifo($fifoPath,?$mode))?{
//????????????????error("create?new?pipe?($name)?error.");
return?false;
}
}?else?{
//????????????error("pipe?($name)?has?exit.");
return?false;
}
$this->fifoPath?=?$fifoPath;
}
///
//??寫管道函數開始
///
function?open_write()
{
$this->w_pipe?=?fopen($this->fifoPath,?'w');
//????????var_dump($this->w_pipe);
if?($this->w_pipe?==?NULL)?{
throw?new?Exception('打開管道錯誤!');
//????????????return?false;
}
return?true;
}
function?write($data)
{
return?fwrite($this->w_pipe,?$data);
}
function?write_all($data)
{
$w_pipe?=?fopen($this->fifoPath,?'w');
fwrite($w_pipe,?$data);
fclose($w_pipe);
}
function?close_write()
{
return?fclose($this->w_pipe);
}
/
///?讀管道相關函數開始
function?open_read()
{
$this->r_pipe?=?fopen($this->fifoPath,?'r');
if?($this->r_pipe?==?NULL)?{
//????????????error("open?pipe?{$this->fifoPath}?for?read?error.");
return?false;
}
return?true;
}
function?read($byte?=?1024)
{
return?fread($this->r_pipe,?$byte);
}
function?read_all()
{
$r_pipe?=?fopen($this->fifoPath,?'r');
$data???=?'';
while?(!feof($r_pipe))?{
//echo?"read?one?K\n";
$data?.=?fread($r_pipe,?1024);
}
fclose($r_pipe);
return?$data;
}
function?close_read()
{
return?fclose($this->r_pipe);
}
/**
*?刪除管道
*
*?@return?boolean?is?success
*/
function?rm_pipe()
{
return?unlink($this->fifoPath);
}
}
六:注意事項
1:管道與普通文件有一點非常不同的就是:管道需要先有個進程讀取進程,才可以寫入,否則按寫入模式打開文件時阻塞,以下是測試截圖:
本文為仙士可原創文章,轉載無需和我聯系,但請注明來自仙士可博客www.php20.cn
總結
以上是生活随笔為你收集整理的php管道邮件,php进程通信-PIPE管道通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 导出csv 转义 逗号转义,在c
- 下一篇: php获得指定位置中间的数据库,PHP