Object Oriented FIFO Communication process:
public functionreceive($bytes=1024);
public functiongetData();
public functionclearData();
public functionsend($data);
}
classFIFOCommunicationimplementsCommunication{
private$fifos;
private$data;
static public functionstream_fifo_open($fifoPath,$mode) {
if (pcntl_fork() ==0) {
if (!file_exists($fifoPath)) {posix_mkfifo($fifoPath,$mode);
}$fifo=fopen($fifoPath,'w');sleep(1);
exit(0);
}
else {usleep(15);
returnfopen($fifoPath,'r');
}
}
static public functionstream_fifo_write($fifoPath,$mode,$data) {
if (pcntl_fork() ==0) {
if (!file_exists($fifoPath)) {posix_mkfifo($fifoPath,$mode);
}$fifo=fopen($fifoPath,'w');fwrite($fifo,$data);
exit(0);
}
}
public function__construct($fifoInputName,$fifoInputMode,$fifoOutputName,$fifoOutputMode) {$this->fifos= array('input'=> array('file'=>self::stream_fifo_open($fifoInputName,$fifoInputMode),'mode'=>$fifoInputMode,'name'=>$fifoInputName,'use'=>'r',
),'output'=> array('mode'=>$fifoOutputMode,'name'=>$fifoOutputName,'use'=>'w')
);
}
public functionremove($type=null) {
switch ($type) {
case'input':
@unlink($this->fifos['input']['name']);
break;
case'output':
@unlink($this->fifos['output']['name']);
break;
default:
@unlink($this->fifos['input']['name']);
@unlink($this->fifos['output']['name']);
}
}
public functionreceive($bytes=1024) {$readers= array($this->fifos['input']['file']);
if (stream_select($readers,$writers=null,$except=null,0,15) ==1) {$data=fread($this->fifos['input']['file'],$bytes);
}
if (! empty($data)) {$this->data.=$data;
returntrue;
}
else {
returnfalse;
}
}
public functiongetData() {
return$this->data;
}
public functionclearData() {$this->data=null;
}
public functionsend($data) {$fifoOutput= &$this->fifos['output'];self::stream_fifo_write($fifoOutput['name'],$fifoOutput['mode'],$data);
}
}$fifoCommunication= newFIFOCommunication(getmypid() .'.input',0600,getmypid() .'.output',0600);
echo"COMMUNICATION STARTEDn";
while (true) {
if ($fifoCommunication->receive()) {$data=$fifoCommunication->getData();
if ($data=="EXITn") {
break;
}
else {$fifoCommunication->send('RECEIVED: '.$fifoCommunication->getData());
}
}sleep(1);
}$fifoComunication->remove();?>