2.3. 对象池模式(Pool)

未匹配的标注

定义

对象池模式是一种提前准备了一组已经初始化了的对象 『池』

uml

PHP

代码实现

<?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使用swoolewebsocket
不应该使用\Illuminate\Support\Facades\Redis,
他们共用的是同一个redis连接,很多请求时,将会发生错误。

应当为每个请求重新创建一个redis连接,
但每次创建,更耗费资源。
创建一个进程池更为优解。

(进程池对于 fpm 这种 应该没啥用 )

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~