swoole 协程channel乱测
channel和数组差不多,可以被用作队列,属性capacity是设置容量,isEmpty() isFull() 用来判断队列是空还是满,push()加入队列 pop()弹出队列
interface pusher
{
function push($data);
}
#require 'redisconn.php';
class mypusher implements pusher
{
protected $mychannel;
protected $size=10;
public function __construct()
{
$this->mychannel = new Swoole\Coroutine\Channel(10);
$this->mylen = $this->mychannel->length();
echo "容量".$this->mychannel->capacity.PHP_EOL;
}
public function push($data)
{
if ($this->mychannel->isFull())
{
return 0;
}
else{
//发送通知
$this->mychannel->push($data);
echo "当前元素个数".$this->mychannel->length();
return 1;
}
}
public function pop()
{
if($this->mychannel->isEmpty())
{
return 0;
}
else
{
echo "当前元素个数".$this->mychannel->length().PHP_EOL;
var_dump($this->mychannel->pop());
echo PHP_EOL."还剩元素个数".$this->mychannel->length().PHP_EOL;
return 1;
}
}
}
go(function (){
$thispusher = new mypusher();
$thispusher->push(['name'=>'cj','age'=>20]);
$thispusher->push(['name'=>'cpc','age'=>22]);
$thispusher->push(['name'=>'xxd','age'=>40]);
$thispusher->pop();
$thispusher->pop();
$thispusher->pop();
});
测试结果:
容量10 当前元素个数1当前元素个数2当前元素个数3当前元素个数3 array(2) { ["name"]=> string(2) "cj" ["age"]=> int(20) } 还剩元素个数2 当前元素个数2 array(2) { ["name"]=> string(3) "cpc" ["age"]=> int(22) } 还剩元素个数1 当前元素个数1 array(2) { ["name"]=> string(3) "xxd" ["age"]=> int(40) } 还剩元素个数0
- 实现一个redis连接池
class redispool
{
protected $mypool;
public function __construct($size)
{
$this->mypool = new Swoole\Coroutine\Channel($size);
for ($i=0;$i<$size;$i++)
{
$redis = new Swoole\Coroutine\Redis();
$redis->setOptions(['compatibility_mode' => true]);
$rconn = $redis->connect('127.0.0.1',6379);
if ($rconn == false)
{
throw new \http\Exception\RuntimeException('Damn~ fail to connet redis-server');
}
else{
$this->mypool->push($redis);
}
}
}
public function push($redis)
{
$this->mypool->push($redis);
}
public function pop()
{
return $this->mypool->pop();
}
}