php模拟队列,PHP模拟一个消息队列,欢迎给出意见

这段代码定义了一个FileStore类用于将队列数据序列化存储到文件中,队列类Queue实现了消息的push和pop操作,以及消息大小的检查。MyMessage类实现了消息接口Message,用于创建带有文字描述的消息。当消息队列满时,尝试添加消息会返回错误,否则消息会被追加到文件。如果文件中的队列已满,会弹出所有消息并删除文件。
摘要由CSDN通过智能技术生成

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;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值