作者 邓超

预热邮件

<?php
//error_reporting();
swoole_set_process_name('php-email-sync-list');
use Swoole\Process;
$pm = new \Swoole\Process\Manager();
$pm->addBatch(60,function ($work_id) {
function start(){
include_once __DIR__."/../vendor/autoload.php";
// 删除停止运行的值
// redis()->delete(SYNC_RUNNING_REDIS_KEY,'email_sync_stop_num');
$number = 0;
while (true){
if($number > 500){ break; }
// 进程管理器
$pm = new Process\Manager();
// 需要同步的id
$id = redis()->lPop('sync_email_lists');
// 启动业务进程
$pm->addBatch(10,function (Process\Pool $pool, int $worker_id){
if($id && is_numeric($id)){
// 占用当前的id,占用2小时
if(redis()->add('just_sync_'.$id,time(),600)){
$number++;
swoole_set_process_name('php-email-sync-list-'.$worker_id);
try{
// 开始同步
$email = db()->cache(3600)->first(\Model\emailSql::first($id));
if($email){
$sync = new \Service\SyncMail($email);
$search = new \Lib\Imap\ImapSearch();
// 第一次同步 只同步当天的
if(!db()->cache(600)->count(\Model\listsSql::first('`id` > 0'))){
$sync->search($search->dateGt($email['created_at']));
}else{
include_once __DIR__."/../vendor/autoload.php";
_echo("业务进程({$worker_id})启动成功");
if(strtotime("-2 day") > strtotime($email['created_at'])){
$sync->search(
$search->dateGt(
date('Y-m-d',
strtotime("-2 day")
)
)
);
}else{
$goNum = 0;
// 循环阻塞
while (true){
while ($goNum > 50){
co::sleep(0.3);
continue;
}
// 需要同步的id
$id = redis()->lPop('sync_email_lists');
if($id && is_numeric($id)){
// 占用当前的id,占用2小时
if(redis()->add('just_sync_'.$id,time(),600)){
// 启动一个协程
go(function () use ($id,&$goNum){
$goNum++;
try{
// 开始同步
$email = db()->cache(3600)->first(\Model\emailSql::first($id));
if($email){
$sync = new \Service\SyncMail($email);
// ai邮件只同步2天内的
$sync->search(
$search->dateGt($email['created_at'])
(new \Lib\Imap\ImapSearch())
->dateGt(date('Y-m-d',strtotime("-1 day")))
);
$sync->sync();
$sync = null;
unset($sync);
}
}catch (Throwable $e){
logs('sync : '.$e->getMessage());
}
$sync->sync();
$sync = null;
unset($sync);
}
// 协程完成后执行的函数
co::defer(function () use ($id,&$goNum){
$goNum--;
// 30秒后 消除占用
redis()->expire('just_sync_'.$id,120);
// 写入日志
\Lib\Log::getInstance()->write();
});
}catch (Throwable $e){
logs('sync : '.$e->getMessage());
});
}
}
//每次都暂停1秒,防止同一时间启动太多的任务
co::sleep(0.1);
// 30秒后 消除占用
redis()->expire('just_sync_'.$id,120);
}
}
else{
sleep(1);
}
}
});
},true);
// 启动管理器
$pm->start();
$pm->start();
}
start();
... ...
... ... @@ -29,35 +29,53 @@ function stop(){
}
}
while (1){
\Co\run(function (){
$goNum = 0;
while (1){
$id = redis()->lPop('sync_email_lists_my');
redis()->set('sync_my_pid:'.getmypid(),time(),86400);
if($goNum>=50){
co::sleep(1);
continue;
}
stop();
$id = redis()->lPop('sync_email_lists_my');
redis()->set('sync_my_pid:'.getmypid(),time(),86400);
// _echo('读取到'.$id);
if($id && is_numeric($id)){
// 占用当前的id,占用2小时
if(redis()->add('just_sync_'.$id,time(),600)){
stop();
try{
// 开始同步
(new \Service\SyncMail($id))->sync();
}catch (Throwable $e){
_echo($e->getMessage());
}
// 30秒后 消除占用
redis()->expire('just_sync_'.$id,30);
// _echo('读取到'.$id);
if($id && is_numeric($id)){
// 占用当前的id,占用2小时
if(redis()->add('just_sync_'.$id,time(),600)){
go(function ($id) use (&$goNum){
$goNum++;
try{
// 开始同步
(new \Service\SyncMail($id))->sync();
}catch (Throwable $e){
_echo($e->getMessage());
}
co::defer(function () use ($id,&$goNum){
$goNum--;
// 30秒后 消除占用
redis()->expire('just_sync_'.$id,30);
\Lib\Log::getInstance()->write();
\Lib\Log::getInstance()->write();
});
},$id);
}
}else{
co::sleep(1);
}
}else{
sleep(1);
}
});
}
... ...