正在显示
5 个修改的文件
包含
137 行增加
和
69 行删除
| @@ -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 |
-
请 注册 或 登录 后发表评论