作者 赵彬吉

rank_data

@@ -2,15 +2,10 @@ @@ -2,15 +2,10 @@
2 2
3 namespace App\Console\Commands\RankData; 3 namespace App\Console\Commands\RankData;
4 4
5 -  
6 use App\Helper\QuanqiusouApi; 5 use App\Helper\QuanqiusouApi;
7 -use App\Http\Logic\Bside\RankData\RankDataLogic;  
8 -use App\Models\Domain\DomainInfo; 6 +use App\Models\RankData\RankDataLog as RankDataLogModel;
9 use App\Models\Project\DeployOptimize; 7 use App\Models\Project\DeployOptimize;
10 use App\Models\Project\Project; 8 use App\Models\Project\Project;
11 -use App\Models\RankData\RankData as GoogleRankModel;  
12 -use App\Utils\LogUtils;  
13 -use Illuminate\Database\Eloquent\Model;  
14 use Illuminate\Support\Facades\Cache; 9 use Illuminate\Support\Facades\Cache;
15 use Illuminate\Support\Facades\Log; 10 use Illuminate\Support\Facades\Log;
16 11
@@ -35,7 +30,7 @@ class RankData extends BaseCommands @@ -35,7 +30,7 @@ class RankData extends BaseCommands
35 * 30 *
36 * @var string 31 * @var string
37 */ 32 */
38 - protected $description = '谷歌排名数据'; 33 + protected $description = '分发任务';
39 34
40 /** 35 /**
41 * @author zbj 36 * @author zbj
@@ -45,67 +40,31 @@ class RankData extends BaseCommands @@ -45,67 +40,31 @@ class RankData extends BaseCommands
45 { 40 {
46 try { 41 try {
47 Log::channel('rank_data')->info('开始-排名数据'); 42 Log::channel('rank_data')->info('开始-排名数据');
  43 +
48 //所有项目 今日是否达标 重置 44 //所有项目 今日是否达标 重置
49 //有失败会重跑任务,导致达标又被重置 加缓存一天只重置一次 45 //有失败会重跑任务,导致达标又被重置 加缓存一天只重置一次
50 if (!Cache::get('clear_remain_today_' . date('Y-m-d'))) { 46 if (!Cache::get('clear_remain_today_' . date('Y-m-d'))) {
51 Project::where('is_remain_today', 1)->update(['is_remain_today' => 0]); 47 Project::where('is_remain_today', 1)->update(['is_remain_today' => 0]);
52 Cache::set('clear_remain_today_' . date('Y-m-d'), 1, 24 * 3600); 48 Cache::set('clear_remain_today_' . date('Y-m-d'), 1, 24 * 3600);
53 } 49 }
54 - $error = 0;  
55 - $api = new QuanqiusouApi();  
56 //有排名api编号的项目 50 //有排名api编号的项目
57 $list = DeployOptimize::where('api_no', '>', 0)->select('api_no', 'project_id')->orderBy('project_id', 'asc')->get(); 51 $list = DeployOptimize::where('api_no', '>', 0)->select('api_no', 'project_id')->orderBy('project_id', 'asc')->get();
58 Log::channel('rank_data')->info('开始-排名数据-' . count($list)); 52 Log::channel('rank_data')->info('开始-排名数据-' . count($list));
59 - //当日所有站点谷歌收录数据  
60 - $site_res = $api->getSiteRes();  
61 - if (!$site_res) {  
62 - Log::channel('rank_data')->error('谷歌收录数据获取失败'); 53 + foreach ($list as $item){
  54 + RankDataLogModel::addTask($item['project_id'], $item['api_no']);
63 } 55 }
64 - foreach ($list as $item) {  
65 - Log::channel('rank_data')->info('项目开始:ID' . $item['project_id'] .' - '. $item['api_no']) . '';  
66 - try {  
67 - (new RankDataLogic())->syncRankData($item['api_no'], $site_res);  
68 - } catch (\Exception $e) {  
69 - Log::channel('rank_data')->error('RankData:失败 ' . $item['api_no'] . $e->getMessage());  
70 - $error++;  
71 - continue; 56 + //小语种
  57 + $api = new QuanqiusouApi();
  58 + $lang_list = $api->getLangList();
  59 + foreach ($list as $item){
  60 + $langs = $lang_list[$item['api_no']] ?? [];
  61 + foreach ($langs as $lang){
  62 + RankDataLogModel::addTask($item['project_id'], $item['api_no'], $lang);
72 } 63 }
73 } 64 }
74 - return !$error;  
75 } catch (\Exception|\Throwable $e) { 65 } catch (\Exception|\Throwable $e) {
76 Log::channel('rank_data')->error('排名数据任务失败 ' . $e->getMessage()); 66 Log::channel('rank_data')->error('排名数据任务失败 ' . $e->getMessage());
77 - throw new \Exception($e->getMessage());  
78 } 67 }
  68 + return true;
79 } 69 }
80 -  
81 - /**  
82 - * 同步项目api_no  
83 - * @author zbj  
84 - * @date 2023/10/16  
85 - */  
86 - public function SyncApiNo(){  
87 - $deploy_optimizes = DeployOptimize::leftJoin('gl_project', 'gl_project.id', '=', 'gl_project_deploy_optimize.project_id')  
88 - ->whereIn('gl_project.type', [Project::TYPE_TWO,Project::TYPE_THREE])->where('gl_project_deploy_optimize.api_no', 0)  
89 - ->where('gl_project_deploy_optimize.domain', '>', 0)  
90 - ->get();  
91 - if(!$deploy_optimizes){  
92 - return true;  
93 - }  
94 - $api = new QuanqiusouApi();  
95 - $ai_nos = $api->getWebApiNo();  
96 - if($ai_nos){  
97 - foreach ($deploy_optimizes as $deploy_optimize){  
98 - $domain = DomainInfo::where('id', $deploy_optimize['domain'])->value('domain');  
99 - if(!$domain){  
100 - continue;  
101 - }  
102 - $api_no = array_search($domain, $ai_nos);  
103 - if($api_no){  
104 - $deploy_optimize->api_no = $api_no;  
105 - $deploy_optimize->save();  
106 - }  
107 - }  
108 - }  
109 - }  
110 -  
111 } 70 }
  1 +<?php
  2 +
  3 +namespace App\Console\Commands\RankData;
  4 +
  5 +
  6 +use App\Helper\Arr;
  7 +use App\Helper\QuanqiusouApi;
  8 +use App\Http\Logic\Bside\BaseLogic;
  9 +use App\Http\Logic\Bside\RankData\RankDataLogic;
  10 +use App\Models\RankData\RankDataLog as RankDataLogModel;
  11 +use App\Models\Project\DeployOptimize;
  12 +use App\Models\Project\Project;
  13 +use Illuminate\Support\Facades\Cache;
  14 +use Illuminate\Support\Facades\Log;
  15 +use Illuminate\Support\Facades\Redis;
  16 +
  17 +/**
  18 + * Class GoogleRank
  19 + * @package App\Console\Commands
  20 + * @author zbj
  21 + * @date 2023/5/6
  22 + */
  23 +class RankDataLog extends BaseCommands
  24 +{
  25 + /**
  26 + * The name and signature of the console command.
  27 + *
  28 + * @var string
  29 + */
  30 + protected $signature = 'rank_data_log';
  31 +
  32 + /**
  33 + * The console command description.
  34 + * The console command description.
  35 + *
  36 + * @var string
  37 + */
  38 + protected $description = '谷歌排名数据';
  39 +
  40 + /**
  41 + * @author zbj
  42 + * @date 2023/5/6
  43 + */
  44 + public function do()
  45 + {
  46 + while (true) {
  47 + $log_id = Redis::rpop('rank_data_task');
  48 + echo $log_id . PHP_EOL;
  49 + if (!$log_id) {
  50 + sleep(10);
  51 + continue;
  52 + }
  53 +
  54 + $log = RankDataLogModel::where('id', $log_id)->where('status', 0)->first();
  55 + if(!$log){
  56 + continue;
  57 + }
  58 + try {
  59 + $this->output('项目开始:ID'.$log->project_id . ',APINO' . $log->api_no);
  60 + $project = Project::find($log->project_id);
  61 + if (!$project) {
  62 + $this->output('关联的项目不存在:ID'.$log->project_id . ',APINO' . $log->api_no);
  63 + $log->status = 9;
  64 + $log->save();
  65 + continue;
  66 + }
  67 + //接口获取数据
  68 + $api = new QuanqiusouApi();
  69 + $res = $api->getGoogleRank($log->project_id, $log->api_no, $log->lang);
  70 + if (!$res) {
  71 + $this->output('接口数据获取失败:ID'.$log->project_id . ',APINO' . $log->api_no);
  72 + $log->status = 9;
  73 + $log->save();
  74 + continue;
  75 + }
  76 + $log->data = Arr::s2a($res);
  77 + //保存数据
  78 + $this->output('保存排名数据:ID'.$log->project_id . ',APINO' . $log->api_no);
  79 + $is_compliance = (new RankDataLogic())->save_rank($log->project_id, $res, null, $log->lang);
  80 + $log->is_compliance = $is_compliance;
  81 + $log->status = 1;
  82 + $log->save();
  83 +
  84 + } catch (\Exception $e) {
  85 + $this->output('处理失败:ID'.$log->project_id . ',APINO' . $log->api_no . ':' . $e->getMessage());
  86 + }
  87 + }
  88 + }
  89 +
  90 + public function output($message)
  91 + {
  92 + $date = date('Y-m-d H:i:s');
  93 + $output = $date . ', ' . $message . PHP_EOL;
  94 + echo $output;
  95 + Log::channel('rank_data')->info($output);
  96 + return true;
  97 + }
  98 +}
@@ -107,7 +107,6 @@ class QuanqiusouApi @@ -107,7 +107,6 @@ class QuanqiusouApi
107 if($res){ 107 if($res){
108 $res = Arr::s2a($res); 108 $res = Arr::s2a($res);
109 Cache::put($key, $res, 2 * 3600); 109 Cache::put($key, $res, 2 * 3600);
110 - RankDataLog::addLog($project_id, $api_no, $lang, $endDay, $res);  
111 } 110 }
112 } catch (\Exception | GuzzleException $e) { 111 } catch (\Exception | GuzzleException $e) {
113 errorLog('获取谷歌排名数据失败', [$api_no], $e); 112 errorLog('获取谷歌排名数据失败', [$api_no], $e);
@@ -447,13 +447,13 @@ class RankDataLogic extends BaseLogic @@ -447,13 +447,13 @@ class RankDataLogic extends BaseLogic
447 447
448 /** 448 /**
449 * @param $project_id 449 * @param $project_id
450 - * @param int $indexed_pages_num 450 + * @param $indexed_pages_num
451 * @param $data 451 * @param $data
452 * @param string $lang 452 * @param string $lang
453 * @author zbj 453 * @author zbj
454 * @date 2023/5/8 454 * @date 2023/5/8
455 */ 455 */
456 - public function save_rank($project_id, $data, int $indexed_pages_num = 0, string $lang = ''){ 456 + public function save_rank($project_id, $data, $indexed_pages_num = null, string $lang = ''){
457 $without_project_ids = []; //不用处理排名的项目 457 $without_project_ids = []; //不用处理排名的项目
458 $without_extension_project_ids = [658]; //是否达标只统计主词的 458 $without_extension_project_ids = [658]; //是否达标只统计主词的
459 $extension_project_ids = [354]; //扩展词也到达标的 459 $extension_project_ids = [354]; //扩展词也到达标的
@@ -548,11 +548,15 @@ class RankDataLogic extends BaseLogic @@ -548,11 +548,15 @@ class RankDataLogic extends BaseLogic
548 $model->first_three_pages_num = $first_three_pages_num; 548 $model->first_three_pages_num = $first_three_pages_num;
549 $model->first_five_pages_num = $first_five_pages_num; 549 $model->first_five_pages_num = $first_five_pages_num;
550 $model->first_ten_pages_num = $first_ten_pages_num; 550 $model->first_ten_pages_num = $first_ten_pages_num;
551 - $model->indexed_pages_num = $indexed_pages_num; 551 + if($indexed_pages_num !== null){
  552 + $model->indexed_pages_num = $indexed_pages_num;
  553 + }
552 $model->lang = $lang; 554 $model->lang = $lang;
553 $model->data = $data; 555 $model->data = $data;
554 $model->updated_date = date('Y-m-d'); 556 $model->updated_date = date('Y-m-d');
555 $model->save(); 557 $model->save();
  558 +
  559 + return $model->is_compliance;
556 } 560 }
557 561
558 /** 562 /**
@@ -5,6 +5,7 @@ namespace App\Models\RankData; @@ -5,6 +5,7 @@ namespace App\Models\RankData;
5 5
6 use App\Helper\Arr; 6 use App\Helper\Arr;
7 use App\Models\Base; 7 use App\Models\Base;
  8 +use Illuminate\Support\Facades\Redis;
8 9
9 /** 10 /**
10 * Class GoogleRank 11 * Class GoogleRank
@@ -27,22 +28,29 @@ class RankDataLog extends Base @@ -27,22 +28,29 @@ class RankDataLog extends Base
27 return Arr::s2a($value); 28 return Arr::s2a($value);
28 } 29 }
29 30
30 - public static function addLog($project_id, $api_no, $lang, $date, $res){  
31 - $data= [];  
32 - foreach ($res as $key=>$item){  
33 - $data[$key] = $item[$date];  
34 - } 31 + public static function addTask($project_id, $api_no, $lang =''){
  32 + $date = date('Y-m-d');
35 $model = self::where('project_id', $project_id)->where('date', $date)->where('lang', $lang)->first(); 33 $model = self::where('project_id', $project_id)->where('date', $date)->where('lang', $lang)->first();
36 - if(!$model){ 34 + if($model){
  35 + //已达标的
  36 + if($model->is_compliance){
  37 + return true;
  38 + }
  39 + //有未执行的
  40 + if(!$model->status){
  41 + return true;
  42 + }
  43 + }else{
37 $model = new self(); 44 $model = new self();
  45 + $model->project_id = $project_id;
  46 + $model->api_no = $api_no;
  47 + $model->lang = $lang;
  48 + $model->date = $date;
38 } 49 }
39 - $model->project_id = $project_id;  
40 - $model->api_no = $api_no;  
41 - $model->lang = $lang;  
42 - $model->date = $date;  
43 - $model->data = $data; 50 + $model->status = 0;
44 $model->save(); 51 $model->save();
45 52
  53 + Redis::lpush('rank_data_task', $model->id);
46 return true; 54 return true;
47 } 55 }
48 56