class FileStore implements Store{
private $path = '';
public function __construct($path){
$this->path = $path;
}
public function set(Queue $q){
file_put_contents($this->path, serialize($q));
}
public function get(){
$string = file_get_contents($this->path);
if(empty($string)){
return null;
}
return unserialize($string);
}
}
class Queue{
private $arr = array();
private $index = 0;
private $max = 10;
public function __construct($max=10){
$this->max = $max;
}
public function isEmpty(){
return $this->index === 0;
}
public function push(Message $m){
if($this->index == $this->max){
return false;
}
$i = $this->index;
$this->arr[$i] = $m;
$this->index = $i+1;
return true;
}
public function pop(){
if($this->index <= 0){
return null;
}
$this->index -= 1;
return array_shift($this->arr);
}
public function size(){
return $this->index;
}
}
class MyMessage implements Message{
private $str = '';
public function __construct($str){
$this->str = $str;
}
public function toString(){
return $this->str;
}
}
interface Store{
public function set(Queue $queue);
public function get();
}
interface Message{
/**
* 返回消息的文字描述
* @author doowan
*/
public function toString();
}
$queueSize = 5;
$path = 'test.txt';
if(!is_file($path)){
touch($path);
}
$store = new FileStore($path);
$queue = $store->get();
if(is_null($queue)){
$queue = new Queue($queueSize);
$store->set($queue);
}
if(isset($_GET['message'])){
$result = $queue->push(new MyMessage($_GET['message']));
if(!$result){
exit('is full!');
}
$store->set($queue);
exit('already append!');
}
while(true){
$queue = $store->get();
if($queue->size() == $queueSize){
$message = $queue->pop();
while(!is_null($message)){
echo $message->toString(), '
';
$message = $queue->pop();
}
unlink($path);
break;
}
}