2.3. 对象池模式(Pool)
定义
对象池模式是一种提前准备了一组已经初始化了的对象 『池』
uml
代码实现
<?php
abstract class WorkPoolAbstract
{
protected $pools = []; //存放所有对象
protected $maxNum = 100; //初始化多少个对象
public function get() // 取出其中一个对象
{
return array_pop($this->pools);
}
public function add($work) //将对象加入到对象池
{
$this->pools[spl_object_hash($work)] = $work;
}
}
//redis进程池
class RedisPool extends WorkPoolAbstract
{
public function init() //初始化所有redis连接 放入$pools
{
for($i =0;$i < $this->maxNum; $i++)
$this->add(new RedisService());
}
}
//redis服务
class RedisService
{
public function put($key,$val)
{
echo "write {$key}".PHP_EOL;
}
public function get($val)
{
echo "get $val".PHP_EOL;
}
}
$redisPool = new RedisPool();
$redisPool->init();
$redisPool->get()->put('key1','val');
$redisPool->get()->get('key1');
使用场景
例如:laravel
使用swoole
的websocket
。
不应该使用\Illuminate\Support\Facades\Redis
,
他们共用的是同一个redis
连接,很多请求时,将会发生错误。
应当为每个请求重新创建一个redis
连接,
但每次创建,更耗费资源。
创建一个进程池
更为优解。
(进程池对于 fpm
这种 应该没啥用 )