作者 邓超

es

... ... @@ -83,17 +83,20 @@ class SyncToEsCmd {
return $this->isStop;
}
/**
* es链接
* @var \Lib\Es\Es
*/
public $es;
public function handler(){
// $es = es(); // 第一个库,即将丢弃
$es2 = es('email_lists_copy'); // 第二个库 新
$this->es = es('email_lists_copy'); // 第二个库 新
while (!$this->isStop()){
$id = redis()->lPop('sync_to_es');
$origin_id = $id;
$code = 500;
if($id){
$is_check_body = false;
... ... @@ -102,17 +105,40 @@ class SyncToEsCmd {
$is_check_body = true;
}
$data = $this->getDataByEs($id,$is_check_body);
if($data){
list($doc_id,$data) = $data;
// 主库
$this->toDataEs('email_lists_copy',$id,$doc_id,$data);
// 分库
$this->toDataEs('email_lists_branch_'.$data['postid'],$id,$doc_id,$data);
}
}else{
// 没有数据时暂停1秒
sleep(1);
}
}
}
$doc_id = '';
/**
* @param $id
* @param $is_check_body
* @return array|false
* @author:dc
* @time 2025/8/5 10:21
*/
public function getDataByEs($id,$is_check_body) {
try {
$data = $this->db->throw()->first(\Model\listsSql::first('`id` = '.$id));
if(!$data){
$data = $this->db->throw()->first(\Model\listsSql::firstHot('`id` = '.$id));
}
}catch (Throwable $e){
redis()->rPush('sync_to_es',$origin_id);
_echo('sync to es '.$e->getMessage());
break;
$this->log($id);
// redis()->rPush('sync_to_es',$origin_id);
_echo('sync to es '.$id.":".$e->getMessage());
return false;
}
if($data){
... ... @@ -144,35 +170,117 @@ class SyncToEsCmd {
list($data['postid'],$data['source']) = $this->getPostid($data['email_id'],$data['udate']);
}catch (Throwable $e){
redis()->rPush('sync_to_es',$origin_id);
_echo('sync to es '.$e->getMessage());
break;
$this->log($id);
// redis()->rPush('sync_to_es',$origin_id);
_echo('sync to es '.$id.":".$e->getMessage());
return false;
}
$data = $this->getEsData($data);
$doc_id = $data['email_id'].'_'.$data['folder_id'].'_'.$data['uid'];
// 新
$code = $es2->save($doc_id,$data);
$doc_id = $data['email_id'].'_'.$data['folder_id'].'_'.$data['uid'];
// 这个验证数据没问题后会丢弃
// $code = $es->save($doc_id,$data);
return [$doc_id,$data];
}
if($code!==200){
@file_put_contents(LOG_PATH.'/sync_es_fail.log',$id."\n",FILE_APPEND);
_echo('同步es: '.$doc_id.'===>'.$code);
return false;
}
}else{
sleep(1);
public $checkEsIndex = [];
/**
* 同步数据到es
* @param string $index 索引名称
* @param int $data_id list表的id
* @param string $doc_id es文档id
* @param array $data es数据
* @author:dc
* @time 2025/8/5 10:09
*/
public function toDataEs($index,$data_id,$doc_id,$data){
// echo $index;
// echo ' ==== ';
$this->es->setIndex($index);
// 检查数据库是否存在
if(empty($this->checkEsIndex[$index])){
if(!$this->es->getMapping()){
$map = $this->es->putMapping([
'properties' => [
'subject' => ['type' => 'text'],
'from' => [
'type' => 'object', // 定义 from 字段为对象
'properties' => [
'name' => [
'type' => 'keyword' // 或者 'keyword',根据需求选择
],
'email' => [
'type' => 'text' // email 通常使用 keyword 类型
]
]
],
'to' => ['type' => 'text'],
'cc' => ['type' => 'keyword'],
'bcc' => ['type' => 'keyword'],
'uid' => ['type' => 'integer'],
'udate' => ['type' => 'integer'],
'folder_id' => ['type' => 'integer'],
'email_id' => ['type' => 'integer'],
'size' => ['type' => 'integer'],
'recent' => ['type' => 'integer'],
'flagged' => ['type' => 'integer'],
'deleted' => ['type' => 'integer'],
'seen' => ['type' => 'integer'],
'draft' => ['type' => 'integer'],
'is_file' => ['type' => 'integer'],
'is_hots' => ['type' => 'integer'],
'is_auto' => ['type' => 'integer'],
'folder_as_int' => ['type' => 'integer'],
'postid' => ['type' => 'integer'],
'source' => ['type' => 'integer'],
'created_at' => ['type' => 'date'],
'updated_at' => ['type' => 'date'],
'description' => ['type' => 'keyword'],
'references' => ['type' => 'keyword']
]
],$index == 'email_lists_copy' ? [
'number_of_shards' => 21, // 设置分片数
'number_of_replicas' => 1, // 设置副本数 暂用内存 主片+副片*
]:[
'number_of_shards' => 1, // 设置分片数
'number_of_replicas' => 0, // 设置副本数 暂用内存 主片+副片*
]
);
_echo("{$index} 创建索引 ".$map);
}
}
// 下次不在检查
$this->checkEsIndex[$index] = 1;
$code = $this->es->save($doc_id,$data);
if($code!==200){
$this->log($data_id,$index);
@file_put_contents(LOG_PATH.'/sync_es_fail.log',$index.":".$data_id."\n",FILE_APPEND);
_echo($index.': '.$data_id.'===>'.$code);
}
}
/**
* 记录日志
* @param $id
* @param string $index
* @author:dc
* @time 2025/8/5 10:17
*/
public function log($id,$index=''){
@file_put_contents(LOG_PATH.'/sync_es_fail.log',$index.":".$id."\n",FILE_APPEND);
}
/**
* 项目id
* @author:dc
... ...