需求:
最近在做一个将数据存入mysql的同时,将数据也存入es中,(因数据量太大没法批量导入)
总不能每次存入es的时候就创建es实例 连接一次es吧,所以封装个单例模式是很有必要的,可以减少不必要的开销。
封装实例:
<?php
namespace App\Http\Controllers\Api\Common;
use Elasticsearch\ClientBuilder;
class ElasticConnect {
/**
* ES的ip
*
* @var string
*/
const ESHOSTNAME = 'ip地址';
/**
* ES的port
*
* @var int
*/
const ESPORT = 9200;
/**
* ES的索引name
*
* @var int
*/
const ESINDEXNAME = '索引名称';
/**
* 类单例
*
* @var object
*/
private static $instance;
/**
* Es的连接句柄
*
* @var object
*/
private $elastic;
/**
* 私有化构造函数,防止类外实例化
*
* @param
*/
private function __construct ()
{
$this->elastic = ClientBuilder::create()->setHosts([self::ESHOSTNAME])->build();
}
/**
* 私有化克隆函数,防止类外克隆对象
*/
private function __clone ()
{}
/**
* 类的唯一公开静态方法,获取类单例的唯一入口
*
* @return object
*/
public static function getEslasticInstance ()
{
if (! (self::$instance instanceof self)) {
self::$instance = new self();
}
return self::$instance;
}
/**
* 获取Es的连接实例
*
* @return
*/
public function getEsConn ()
{
return $this->elastic;
}
/**
* 需要在单例切换的时候做清理工作
*/
public function __destruct ()
{
self::$instance->elastic->close();
self::$instance = NULL;
}
}
调用的地方:
首先你要引入这个实例
use App\Http\Controllers\Api\Common\ElasticConnect;
调用:
// 聊天数据插入es
$client = ElasticConnect::getEslasticInstance()->getEsConn();
至于调用之后怎么存入es中可以看我其他文章:PHP中使用ElasticSearch(一)