作者 赵彬吉

rank_data

... ... @@ -2,15 +2,10 @@
namespace App\Console\Commands\RankData;
use App\Helper\QuanqiusouApi;
use App\Http\Logic\Bside\RankData\RankDataLogic;
use App\Models\Domain\DomainInfo;
use App\Models\RankData\RankDataLog as RankDataLogModel;
use App\Models\Project\DeployOptimize;
use App\Models\Project\Project;
use App\Models\RankData\RankData as GoogleRankModel;
use App\Utils\LogUtils;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;
... ... @@ -35,7 +30,7 @@ class RankData extends BaseCommands
*
* @var string
*/
protected $description = '谷歌排名数据';
protected $description = '分发任务';
/**
* @author zbj
... ... @@ -45,67 +40,31 @@ class RankData extends BaseCommands
{
try {
Log::channel('rank_data')->info('开始-排名数据');
//所有项目 今日是否达标 重置
//有失败会重跑任务,导致达标又被重置 加缓存一天只重置一次
if (!Cache::get('clear_remain_today_' . date('Y-m-d'))) {
Project::where('is_remain_today', 1)->update(['is_remain_today' => 0]);
Cache::set('clear_remain_today_' . date('Y-m-d'), 1, 24 * 3600);
}
$error = 0;
$api = new QuanqiusouApi();
//有排名api编号的项目
$list = DeployOptimize::where('api_no', '>', 0)->select('api_no', 'project_id')->orderBy('project_id', 'asc')->get();
Log::channel('rank_data')->info('开始-排名数据-' . count($list));
//当日所有站点谷歌收录数据
$site_res = $api->getSiteRes();
if (!$site_res) {
Log::channel('rank_data')->error('谷歌收录数据获取失败');
foreach ($list as $item){
RankDataLogModel::addTask($item['project_id'], $item['api_no']);
}
foreach ($list as $item) {
Log::channel('rank_data')->info('项目开始:ID' . $item['project_id'] .' - '. $item['api_no']) . '';
try {
(new RankDataLogic())->syncRankData($item['api_no'], $site_res);
} catch (\Exception $e) {
Log::channel('rank_data')->error('RankData:失败 ' . $item['api_no'] . $e->getMessage());
$error++;
continue;
//小语种
$api = new QuanqiusouApi();
$lang_list = $api->getLangList();
foreach ($list as $item){
$langs = $lang_list[$item['api_no']] ?? [];
foreach ($langs as $lang){
RankDataLogModel::addTask($item['project_id'], $item['api_no'], $lang);
}
}
return !$error;
} catch (\Exception|\Throwable $e) {
Log::channel('rank_data')->error('排名数据任务失败 ' . $e->getMessage());
throw new \Exception($e->getMessage());
}
return true;
}
/**
* 同步项目api_no
* @author zbj
* @date 2023/10/16
*/
public function SyncApiNo(){
$deploy_optimizes = DeployOptimize::leftJoin('gl_project', 'gl_project.id', '=', 'gl_project_deploy_optimize.project_id')
->whereIn('gl_project.type', [Project::TYPE_TWO,Project::TYPE_THREE])->where('gl_project_deploy_optimize.api_no', 0)
->where('gl_project_deploy_optimize.domain', '>', 0)
->get();
if(!$deploy_optimizes){
return true;
}
$api = new QuanqiusouApi();
$ai_nos = $api->getWebApiNo();
if($ai_nos){
foreach ($deploy_optimizes as $deploy_optimize){
$domain = DomainInfo::where('id', $deploy_optimize['domain'])->value('domain');
if(!$domain){
continue;
}
$api_no = array_search($domain, $ai_nos);
if($api_no){
$deploy_optimize->api_no = $api_no;
$deploy_optimize->save();
}
}
}
}
}
... ...
<?php
namespace App\Console\Commands\RankData;
use App\Helper\Arr;
use App\Helper\QuanqiusouApi;
use App\Http\Logic\Bside\BaseLogic;
use App\Http\Logic\Bside\RankData\RankDataLogic;
use App\Models\RankData\RankDataLog as RankDataLogModel;
use App\Models\Project\DeployOptimize;
use App\Models\Project\Project;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;
/**
* Class GoogleRank
* @package App\Console\Commands
* @author zbj
* @date 2023/5/6
*/
class RankDataLog extends BaseCommands
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'rank_data_log';
/**
* The console command description.
* The console command description.
*
* @var string
*/
protected $description = '谷歌排名数据';
/**
* @author zbj
* @date 2023/5/6
*/
public function do()
{
while (true) {
$log_id = Redis::rpop('rank_data_task');
echo $log_id . PHP_EOL;
if (!$log_id) {
sleep(10);
continue;
}
$log = RankDataLogModel::where('id', $log_id)->where('status', 0)->first();
if(!$log){
continue;
}
try {
$this->output('项目开始:ID'.$log->project_id . ',APINO' . $log->api_no);
$project = Project::find($log->project_id);
if (!$project) {
$this->output('关联的项目不存在:ID'.$log->project_id . ',APINO' . $log->api_no);
$log->status = 9;
$log->save();
continue;
}
//接口获取数据
$api = new QuanqiusouApi();
$res = $api->getGoogleRank($log->project_id, $log->api_no, $log->lang);
if (!$res) {
$this->output('接口数据获取失败:ID'.$log->project_id . ',APINO' . $log->api_no);
$log->status = 9;
$log->save();
continue;
}
$log->data = Arr::s2a($res);
//保存数据
$this->output('保存排名数据:ID'.$log->project_id . ',APINO' . $log->api_no);
$is_compliance = (new RankDataLogic())->save_rank($log->project_id, $res, null, $log->lang);
$log->is_compliance = $is_compliance;
$log->status = 1;
$log->save();
} catch (\Exception $e) {
$this->output('处理失败:ID'.$log->project_id . ',APINO' . $log->api_no . ':' . $e->getMessage());
}
}
}
public function output($message)
{
$date = date('Y-m-d H:i:s');
$output = $date . ', ' . $message . PHP_EOL;
echo $output;
Log::channel('rank_data')->info($output);
return true;
}
}
... ...
... ... @@ -107,7 +107,6 @@ class QuanqiusouApi
if($res){
$res = Arr::s2a($res);
Cache::put($key, $res, 2 * 3600);
RankDataLog::addLog($project_id, $api_no, $lang, $endDay, $res);
}
} catch (\Exception | GuzzleException $e) {
errorLog('获取谷歌排名数据失败', [$api_no], $e);
... ...
... ... @@ -447,13 +447,13 @@ class RankDataLogic extends BaseLogic
/**
* @param $project_id
* @param int $indexed_pages_num
* @param $indexed_pages_num
* @param $data
* @param string $lang
* @author zbj
* @date 2023/5/8
*/
public function save_rank($project_id, $data, int $indexed_pages_num = 0, string $lang = ''){
public function save_rank($project_id, $data, $indexed_pages_num = null, string $lang = ''){
$without_project_ids = []; //不用处理排名的项目
$without_extension_project_ids = [658]; //是否达标只统计主词的
$extension_project_ids = [354]; //扩展词也到达标的
... ... @@ -548,11 +548,15 @@ class RankDataLogic extends BaseLogic
$model->first_three_pages_num = $first_three_pages_num;
$model->first_five_pages_num = $first_five_pages_num;
$model->first_ten_pages_num = $first_ten_pages_num;
$model->indexed_pages_num = $indexed_pages_num;
if($indexed_pages_num !== null){
$model->indexed_pages_num = $indexed_pages_num;
}
$model->lang = $lang;
$model->data = $data;
$model->updated_date = date('Y-m-d');
$model->save();
return $model->is_compliance;
}
/**
... ...
... ... @@ -5,6 +5,7 @@ namespace App\Models\RankData;
use App\Helper\Arr;
use App\Models\Base;
use Illuminate\Support\Facades\Redis;
/**
* Class GoogleRank
... ... @@ -27,22 +28,29 @@ class RankDataLog extends Base
return Arr::s2a($value);
}
public static function addLog($project_id, $api_no, $lang, $date, $res){
$data= [];
foreach ($res as $key=>$item){
$data[$key] = $item[$date];
}
public static function addTask($project_id, $api_no, $lang =''){
$date = date('Y-m-d');
$model = self::where('project_id', $project_id)->where('date', $date)->where('lang', $lang)->first();
if(!$model){
if($model){
//已达标的
if($model->is_compliance){
return true;
}
//有未执行的
if(!$model->status){
return true;
}
}else{
$model = new self();
$model->project_id = $project_id;
$model->api_no = $api_no;
$model->lang = $lang;
$model->date = $date;
}
$model->project_id = $project_id;
$model->api_no = $api_no;
$model->lang = $lang;
$model->date = $date;
$model->data = $data;
$model->status = 0;
$model->save();
Redis::lpush('rank_data_task', $model->id);
return true;
}
... ...