|
@@ -18,16 +18,16 @@ function start(){ |
|
@@ -18,16 +18,16 @@ function start(){ |
|
18
|
$pm = new Process\Manager();
|
18
|
$pm = new Process\Manager();
|
|
19
|
|
19
|
|
|
20
|
// 启动一个进程来管理定时
|
20
|
// 启动一个进程来管理定时
|
|
21
|
- $pm->add(function (Process\Pool $pool, int $workerId){
|
|
|
|
22
|
- _echo("定时进程({$workerId})启动成功");
|
|
|
|
23
|
-
|
|
|
|
24
|
-
|
|
|
|
25
|
- // 进行阻塞,否则定时器无法运行
|
|
|
|
26
|
- while (true){
|
|
|
|
27
|
- co::sleep(9999);
|
|
|
|
28
|
- }
|
|
|
|
29
|
-
|
|
|
|
30
|
- },true);
|
21
|
+// $pm->add(function (Process\Pool $pool, int $workerId){
|
|
|
|
22
|
+// _echo("定时进程({$workerId})启动成功");
|
|
|
|
23
|
+//
|
|
|
|
24
|
+//
|
|
|
|
25
|
+// // 进行阻塞,否则定时器无法运行
|
|
|
|
26
|
+// while (true){
|
|
|
|
27
|
+// co::sleep(9999);
|
|
|
|
28
|
+// }
|
|
|
|
29
|
+//
|
|
|
|
30
|
+// },true);
|
|
31
|
|
31
|
|
|
32
|
|
32
|
|
|
33
|
// 协程配置
|
33
|
// 协程配置
|
|
@@ -63,7 +63,7 @@ function start(){ |
|
@@ -63,7 +63,7 @@ function start(){ |
|
63
|
sync($id,$worker_id);
|
63
|
sync($id,$worker_id);
|
|
64
|
}catch (\Throwable $e){
|
64
|
}catch (\Throwable $e){
|
|
65
|
// 重新发布同步任务,如果失败了是否重新发布
|
65
|
// 重新发布同步任务,如果失败了是否重新发布
|
|
66
|
- redis()->rPush('sync_email_lists',$id);
|
66
|
+// redis()->rPush('sync_email_lists',$id);
|
|
67
|
|
67
|
|
|
68
|
// _echo($e->getMessage());
|
68
|
// _echo($e->getMessage());
|
|
69
|
logs(
|
69
|
logs(
|
|
@@ -101,13 +101,115 @@ function start(){ |
|
@@ -101,13 +101,115 @@ function start(){ |
|
101
|
|
101
|
|
|
102
|
|
102
|
|
|
103
|
},true);
|
103
|
},true);
|
|
|
|
104
|
+ // 启动一个同步内容的进程
|
|
|
|
105
|
+ $pm->add(function (Process\Pool $pool, int $worker_id){
|
|
|
|
106
|
+ _echo("业务进程({$worker_id})启动成功,body");
|
|
104
|
|
107
|
|
|
|
|
108
|
+ $start_num = 0;// 启动的协程数量
|
|
|
|
109
|
+
|
|
|
|
110
|
+ // 循环阻塞
|
|
|
|
111
|
+ while (true){
|
|
|
|
112
|
+ // 是否到了协程配置的数量上限
|
|
|
|
113
|
+ if($start_num < 50){
|
|
|
|
114
|
+ // 需要同步的id
|
|
|
|
115
|
+ $id = redis()->lPop('sync_email_body');
|
|
|
|
116
|
+
|
|
|
|
117
|
+ if(!$id){
|
|
|
|
118
|
+ co::sleep(1);
|
|
|
|
119
|
+ }else{
|
|
|
|
120
|
+ // 占用当前的id,占用2小时
|
|
|
|
121
|
+ redis()->add('just_sync_body_'.$id['lists_id'],time(),600);
|
|
|
|
122
|
+ // 启动一个协程
|
|
|
|
123
|
+ go(function () use (&$start_num,$worker_id,$id){
|
|
|
|
124
|
+
|
|
|
|
125
|
+ $start_num++;
|
|
|
|
126
|
+
|
|
|
|
127
|
+ // 开始同步
|
|
|
|
128
|
+ try {
|
|
|
|
129
|
+ sync_body($id,$worker_id);
|
|
|
|
130
|
+ }catch (\Throwable $e){
|
|
|
|
131
|
+// _echo($e->getMessage());
|
|
|
|
132
|
+ logs(
|
|
|
|
133
|
+ $e->getMessage().PHP_EOL.$e->getTraceAsString(),
|
|
|
|
134
|
+ LOG_PATH.'/'.$worker_id.'_'.co::getCid().'.log'
|
|
|
|
135
|
+ );
|
|
|
|
136
|
+ }
|
|
|
|
137
|
+
|
|
|
|
138
|
+ // 协程完成后执行的函数
|
|
|
|
139
|
+ co::defer(function () use (&$start_num,$worker_id,$id){
|
|
|
|
140
|
+// _echo('正常关闭进程('.$worker_id.')下的协程('.co::getCid().')');
|
|
|
|
141
|
+ $start_num--;
|
|
|
|
142
|
+ // 消除占用
|
|
|
|
143
|
+ redis()->delete('just_sync_body_'.$id['lists_id']);
|
|
|
|
144
|
+ // 写入日志
|
|
|
|
145
|
+ \Lib\Log::getInstance()->write();
|
|
|
|
146
|
+
|
|
|
|
147
|
+ // 关闭数据库链接
|
|
|
|
148
|
+ db()->close();
|
|
|
|
149
|
+ // 关闭redis链接
|
|
|
|
150
|
+ redis()->close();
|
|
|
|
151
|
+
|
|
|
|
152
|
+ });
|
|
|
|
153
|
+
|
|
|
|
154
|
+ });
|
|
|
|
155
|
+
|
|
|
|
156
|
+ }
|
|
|
|
157
|
+ }else{
|
|
|
|
158
|
+ // 协程到了最大的数量,阻塞1秒
|
|
|
|
159
|
+ co::sleep(1);
|
|
|
|
160
|
+ }
|
|
|
|
161
|
+
|
|
|
|
162
|
+
|
|
|
|
163
|
+ }
|
|
|
|
164
|
+
|
|
|
|
165
|
+
|
|
|
|
166
|
+ },true);
|
|
105
|
|
167
|
|
|
106
|
// 启动管理器
|
168
|
// 启动管理器
|
|
107
|
$pm->start();
|
169
|
$pm->start();
|
|
108
|
|
170
|
|
|
109
|
}
|
171
|
}
|
|
110
|
|
172
|
|
|
|
|
173
|
+/**
|
|
|
|
174
|
+ * 同步内容 body
|
|
|
|
175
|
+ * @param $id
|
|
|
|
176
|
+ * @param $worker_id
|
|
|
|
177
|
+ * @return int
|
|
|
|
178
|
+ * @author:dc
|
|
|
|
179
|
+ * @time 2023/3/23 10:18
|
|
|
|
180
|
+ */
|
|
|
|
181
|
+function sync_body($id,$worker_id){
|
|
|
|
182
|
+
|
|
|
|
183
|
+ // 是否有数据
|
|
|
|
184
|
+ if(db()->count(\Model\bodySql::has((int) $id['lists_id']))){
|
|
|
|
185
|
+ return 0;
|
|
|
|
186
|
+ }
|
|
|
|
187
|
+
|
|
|
|
188
|
+ $email = db()->first(\Model\emailSql::first($id['email_id']));
|
|
|
|
189
|
+ if(!$email){
|
|
|
|
190
|
+ return 0;
|
|
|
|
191
|
+ }
|
|
|
|
192
|
+
|
|
|
|
193
|
+ if($email['pwd_error']){
|
|
|
|
194
|
+ return 1;
|
|
|
|
195
|
+ }
|
|
|
|
196
|
+
|
|
|
|
197
|
+ $mailServer = new Lib\Mail\Mail($email['email'],base64_decode($email['password']),$email['imap']);
|
|
|
|
198
|
+
|
|
|
|
199
|
+ // 登录服务器
|
|
|
|
200
|
+ if(!$mailServer->login()){
|
|
|
|
201
|
+ return 2;
|
|
|
|
202
|
+ }
|
|
|
|
203
|
+
|
|
|
|
204
|
+ // 同步 body
|
|
|
|
205
|
+ $mailServer->syncBody($id['folder'],$id['uid'],$id['lists_id'],db());
|
|
|
|
206
|
+
|
|
|
|
207
|
+ $mailServer = null;
|
|
|
|
208
|
+
|
|
|
|
209
|
+ return 0;
|
|
|
|
210
|
+
|
|
|
|
211
|
+}
|
|
|
|
212
|
+
|
|
111
|
|
213
|
|
|
112
|
/**
|
214
|
/**
|
|
113
|
* 开始同步, 这里是主要的业务代码
|
215
|
* 开始同步, 这里是主要的业务代码
|