作者 邓超

调优

正在显示 1 个修改的文件 包含 0 行增加227 行删除
1 -<?php  
2 -  
3 -//error_reporting();  
4 -  
5 -require_once "../vendor/autoload.php";  
6 -  
7 -  
8 -if(in_array('v2',$argv)){  
9 - define('S_V2','2');  
10 -}else{  
11 - define('S_V2','');  
12 -}  
13 -  
14 -/**  
15 - * 把mysql的数据同步到es  
16 - * @author:dc  
17 - * @time 2025/3/4 10:19  
18 - * Class SyncToEsCmd  
19 - */  
20 -class SyncToEsCmd {  
21 -  
22 - public $isStop = false;  
23 -  
24 - /**  
25 - * 文件夹  
26 - * @var array  
27 - */  
28 - public $folders = [];  
29 -  
30 - /**  
31 - * @var \Lib\Db  
32 - */  
33 - public $fob_db;  
34 -  
35 - public function handler(){  
36 -  
37 - $handler = function ($signal){  
38 - _echo('收到进程信号 '. $signal);  
39 - // 可以处理其他程序  
40 - $this->isStop = true;  
41 - };  
42 - pcntl_signal(SIGTERM, $handler); // 这个是kill  
43 - pcntl_signal(SIGINT, $handler); // 这个是 ctrl+c  
44 -// pcntl_signal(SIGHUP, $handler);  
45 -  
46 -  
47 - if(S_V2){  
48 - $es = es('email_lists_copy');  
49 - }else{  
50 - $es = es();  
51 - }  
52 -  
53 - $db = db();  
54 - $this->fob_db = fob_mysql();  
55 - $startTime = time();  
56 - // 查询gmail的所有邮件文件夹 ai邮件不同步这个文件夹  
57 - $fids = $db->throw()->all("select `id` from `folders` where `origin_folder` in ('[Gmail]/&UWiQ6JD1TvY-','[Gmail]/All Mail','[Gmail]/&YkBnCZCuTvY-')");  
58 - $fids = array_column($fids,'id','id');  
59 -  
60 - while (1){  
61 -  
62 - if(time()-43200 > $startTime){  
63 - break;  
64 - }  
65 -  
66 - // 检查是否接收到信号  
67 - pcntl_signal_dispatch();  
68 -  
69 - if($this->isStop) {  
70 - _echo('已退出进程');  
71 - break;  
72 - }  
73 -  
74 - $id = redis()->rPop('sync_to_es'.S_V2);  
75 - $code = 500;  
76 - if($id){  
77 - $doc_id = '';  
78 - try {  
79 - $data = $db->throw()->first('select * from `lists_hot` where `id` = '.$id);  
80 - if(!$data){  
81 - $data = $db->throw()->first('select * from `lists` where `id` = '.$id);  
82 - }  
83 - }catch (Throwable $e){  
84 - redis()->lPush('sync_to_es'.S_V2,$id);  
85 - _echo('sync to es '.$e->getMessage());  
86 - break;  
87 - }  
88 -  
89 - if($data){  
90 - // 是否是所有邮件文件夹 是就跳过  
91 - if($fids[$data['folder_id']]??0){  
92 - continue;  
93 - }  
94 - // 设置 进程 是否在运行  
95 - $data['is_auto'] = $db->count('select count(*) from `lists_auto` where `list_id` = '.$data['id']) ? 1 : 0;  
96 - try {  
97 - // 文件夹  
98 - if(empty($this->folders[$data['folder_id']])){  
99 - $this->folders[$data['folder_id']] = $db->throw()->value(\Model\folderSql::first($data['folder_id'],'folder'));  
100 - }  
101 - // 为文件夹打标 方便查询  
102 - $data['folder_as_int'] = folder2int($this->folders[$data['folder_id']]);  
103 -  
104 - // 再次验证是否是自动回复  
105 - if($data['folder_as_int'] === 1 && !$data['is_auto']){  
106 - $filter = redis()->get('ai_email_filter_lists',[]);  
107 - $filter = is_array($filter) ? $filter : [];  
108 - foreach ($filter as $f){  
109 - list($t,$str) = $f;  
110 - $haystack = '';  
111 - if($t==2){  
112 - $haystack = $data['subject'];  
113 - }elseif ($t==1){  
114 - $haystack = $data['from'];  
115 - }  
116 - if($haystack && $str && stripos($haystack,$str)!==false){  
117 - $data['is_auto'] = 1;  
118 - break;  
119 - }  
120 - }  
121 - }  
122 - // 再次验证是否是预热邮件  
123 -// if()  
124 -  
125 - // postid ai邮箱要用 这个是查询黑格  
126 - list($data['postid'],$data['source']) = $this->getPostid($data['email_id']);  
127 - }catch (Throwable $e){  
128 - redis()->lPush('sync_to_es'.S_V2,$id);  
129 - _echo('sync to es '.$e->getMessage());  
130 - break;  
131 - }  
132 -  
133 - $data = $this->getEsData($data);  
134 - $doc_id = $data['email_id'].'_'.$data['folder_id'].'_'.$data['uid'];  
135 -  
136 - $code = $es->save($doc_id,$data);  
137 - }  
138 -  
139 - if($code!==200){  
140 - @file_put_contents(LOG_PATH.'/sync_es_fail'.S_V2.'.log',$id."\n",FILE_APPEND);  
141 - _echo('同步es: '.$doc_id.'===>'.$code);  
142 - }  
143 - // _echo('同步es: '.$doc_id.'===>'.$code);  
144 - // print_r($data);  
145 - // var_dump($id);  
146 - // exit;  
147 - }else{  
148 - sleep(1);  
149 - }  
150 - }  
151 -  
152 - }  
153 -  
154 -  
155 - /**  
156 - * 查询项目id 和 邮件来源  
157 - * @param int $email_id 邮箱id  
158 - * @return array  
159 - * @author:dc  
160 - * @time 2025/5/29 11:47  
161 - */  
162 - public function getPostid($email_id){  
163 - $data = redis()->getSet('fob_bind_mailx:'.$email_id,300,function ($email_id){  
164 - return $this->fob_db->throw()->first("select `post_id`,`source` from `e_mail_binds` where `email_id` = '{$email_id}' order by `id` desc limit 1");  
165 - },$email_id);  
166 -  
167 - return [  
168 - $data['post_id']??0,  
169 - $data['source']??0,  
170 - ];  
171 - }  
172 -  
173 -  
174 - public function getEsData($data){  
175 - if(!empty($data['id'])){  
176 - $data['uuid'] = $data['id'];  
177 - unset($data['id']);  
178 - }  
179 -  
180 - $data['from'] = [  
181 - 'email' => $data['from'],  
182 - 'name' => $data['from_name']??''  
183 - ];  
184 - unset($data['from_name']);  
185 - unset($data['date']);  
186 -  
187 - if(!empty($data['to_name']) && strlen($data['to_name'])>10000){  
188 - $data['to_name'] = @json_decode($data['to_name'],true);  
189 - if(is_array($data['to_name'])){  
190 - $data['to_name'] = array_map(function ($v){  
191 - $v['name'] = '';  
192 - return $v;  
193 - },$data['to_name']);  
194 - $data['to_name'] = array_slice($data['to_name'],0,100);  
195 - $data['to_name'] = json_encode($data['to_name']);  
196 - }else{  
197 - $data['to_name'] = '';  
198 - }  
199 - }  
200 - $data['description'] = str_replace(["\n"],"",$data['description']);  
201 - // unset($data['to_name']);  
202 -  
203 - if(!empty($data['created_at'])){  
204 - $data['created_at'] = date('Y-m-d\TH:i:s',strtotime($data['created_at']));  
205 - }  
206 - if(!empty($data['updated_at'])){  
207 - $data['updated_at'] = date('Y-m-d\TH:i:s',strtotime($data['updated_at']));  
208 - }  
209 - $data['references'] = empty($data['references']) ? '' : $data['references'];  
210 - return $data;  
211 - }  
212 -  
213 -  
214 -}  
215 -  
216 -(new SyncToEsCmd())->handler();  
217 -  
218 -return 1;  
219 -  
220 -  
221 -  
222 -  
223 -  
224 -  
225 -  
226 -  
227 -