14days laravel

<?php

namespace App\Console\Commands\Mining;

use App\Console\Commands\Core\BaseCommand;
use App\Repository\Core\ScriptStatusRepo;
use App\Repository\Mining\MoversTopKRepo;
use App\Repository\Mining\MoversTopKMinersRepo;

use Illuminate\Support\Facades\DB;
use App\Core\Common\Helpers\MiningHelper;

/**
 * Listing分析脚本
 * @auth ives
 * @since 20170606 0.0.1
 */
class GetTopKAsins extends BaseCommand
{
    /**
     * The name and signature of the console command.
     * DATA_CENTER_MANAGE_SYSTEM
     * @var string
     */
    protected $signature = ‘movers {country}‘;

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = ‘获取爬虫采集的飙升榜 参数:国家码‘;

    /**
     * @var
     */
    public $country;

    /**
     * @var
     */
    public $createDatas;

    /**
     * @var ScriptStatusRepo
     */
    public $statHandler;

    /**
     * @var 暂时略过的 listid>1000 的数据,后续分析
     */
    public $listidThan1000Arr = [];

    /**
     * Create a new command instance.
     *
     * @return void
     */

    //當前爬蟲飆升榜最大主鍵
    public $moversTopKRepoMaxId;

    public function __construct(
        MoversTopKRepo $moversTopKRepo
        , MoversTopKMinersRepo $moversTopKMinersRepo
    )
    {
        parent::__construct();
        $this->moversTopKRepo = $moversTopKRepo;
        $this->moversTopKMinersRepo = $moversTopKMinersRepo;
    }

    public function handle()
    {
        $this->info(‘start 获取爬虫采集的飙升榜‘);

        $country = $this->argument(‘country‘);
        $countrys = MiningHelper::getCountrys();
        if (!in_array($country, $countrys)) {
            $this->error($country . ‘ is not country code‘);
            exit();
        }
        $this->country = $country;
        //任务名称
        //支持多国家同时运行
        $this->statHandler = new ScriptStatusRepo(‘GetTopKAsins_‘ . $country . ‘‘);

        //开启任务
        $endPoint = $this->start();

        //TODO 需结合脚本自身和爬虫脚本执行频率修改
        //从panew.amazon_keyword_* 表中取 1000 条记录 分块处理
        //一次選3000
        $step = 3000;
        $id_range = $this->moversTopKRepoMaxId - $step;
        $db_getMoversTopK = $this->moversTopKRepo->getMoversTopK($id_range);
        foreach ($db_getMoversTopK as $k => $asinArr) {
            $this->mainFun($asinArr);
        }

        //结束任务
        $this->finish();
    }

    public function start()
    {
        //任务已存在则不执行
        if (!$this->statHandler->scriptExist()) {
            $this->info(‘任务已存在则不执行script exist..‘);
            exit();
        }
        $statHandler = $this->statHandler;
        $endPoint = $statHandler->getEndPoint();

        $this->info(‘上次執行后,分析至amazon_movers_‘ . $this->country . ‘的主鍵=‘ . $endPoint);
        $maxId = $this->moversTopKRepo->getMoversTopKMaxId();
        $maxId = $maxId[0][‘maxId‘];
        $this->moversTopKRepoMaxId = $maxId;
        if ($maxId <= $endPoint) {
            $this->info(‘當前amazon_movers_‘ . $this->country . ‘最大主鍵--maxId=‘ . $maxId . ‘無新數據待分析‘);
            exit();
        } else {
            $this->info(‘已經校驗當前amazon_movers_‘ . $this->country . ‘最大主鍵--maxId=‘ . $maxId . ‘---開始分析---‘);

        }

        //开启
        $statHandler->scriptStart($endPoint);
        return $endPoint;

    }

    public function finish()
    {
        $statHandler = $this->statHandler;
        $statHandler->freshEndPoint($this->moversTopKRepoMaxId);
        $statHandler->scriptEnd(2);
        $this->error(‘更新脚本狀態表endPoint=‘ . $this->moversTopKRepoMaxId . ‘:本次完成分許,正常結束--script finished!‘);
    }

    public function mainFun($asinArr)
    {

        foreach ($asinArr as $k => $v) {
            $$k = $v;
        }

        //sales_rank_now > 1000 pass
        if ($asinArr[‘sales_rank_now‘] > 1000) {
            $this->info(‘sales_rank_now=‘ . $asinArr[‘sales_rank_now‘] . ‘---排名大于1000‘);
            return;
        }

        $if_existed = $this->moversTopKMinersRepo->chkAsinExisted($asinArr[‘asin‘]);
        if ($if_existed) {
            $this->info(‘miner_movers_shakers_‘ . $this->country . ‘中存在asin=‘ . $asinArr[‘asin‘] . ‘:跳过‘);
            return;
        } else {
            $this->info(‘miner_movers_shakers_‘ . $this->country . ‘中不存在asin=‘ . $asinArr[‘asin‘] . ‘:继续‘);

        }

        $data[‘asin‘] = $asin;
        $data[‘img‘] = $pic_url;
        $data[‘first_inrank‘] = $add_time;
        $data[‘first_rapidly‘] = $sales_rank_ago;
        $data[‘created_at‘] = date(‘Y-m-d H:i:s‘);
        $data[‘updated_at‘] = date(‘Y-m-d‘);
        $data[‘price‘] = $price;
        $data[‘bsr1‘] = $sales_rank_now;
        $data[‘bsr1path‘] = $cate_id;
        $data[‘reviews‘] = $review_counts;
        // 首次
        $data[‘status‘] = 1;
        $data[‘is_top1000‘] = 1;
        $data[‘day_span‘] = 14;
        $data[‘top_count‘] = 1;
        $data[‘is_steady‘] = 0;

        $data[‘end_date‘] = date("Y-m-d", strtotime("+14 Days"));
        $data_add_quote = array();
        foreach ($data as $k => $v) {
            $data_add_quote[$k] = ‘`‘ . $v . ‘`‘;
        }
        // $data = $data_add_quote;
        $table = ‘miner_movers_shakers_‘ . $this->country;
        try {

            DB::connection(‘mining_db‘)
                ->table($table)
                ->insert($data);
            $this->info(‘对‘ . $table . ‘新增asin=‘ . $asin);
        } catch (Exception $exception) {
            $this->info(‘db异常停止:‘ . $exception);
            $this->statHandler->scriptEnd(3);
        }

        //对listing采集表collect_listing_asins以asin+country为条件添加或者更新
        $table_collect_listing_asins = ‘collect_listing_asins‘;
        try {
            $data = array();
            $data[‘asin‘] = $asin;
            $data[‘country‘] = $this->country;

            $res = DB::connection(‘mining_db‘)
                ->table($table_collect_listing_asins)
                ->select(‘id‘, ‘pass_at‘)
                ->where(‘country‘, ‘=‘, $this->country)
                ->where(‘asin‘, ‘=‘, $asin)
                ->where(‘status‘, ‘=‘, 1)
                ->orderBy(‘id‘, ‘desc‘)
                ->limit(1)
                ->first();
            $str_info = $table_collect_listing_asins . ‘asin=‘ . $asin . ‘+country=‘ . $this->country . ‘+sataus=1--‘;
            if (empty($res)) {
                $this->info(‘查询‘ . $str_info . ‘无数据‘ . ‘:新增‘);
                $data[‘is_fresh‘] = 1;
                $data[‘status‘] = 1;
                $data[‘updated_at‘] = date(‘Y-m-d H:i:s‘);
                $data[‘pass_at‘] = date("Y-m-d", strtotime("+14 Days"));
                //TODO
                DB::connection(‘mining_db‘)
                    ->table($table_collect_listing_asins)
                    ->insert($data);
            } else {

                $id = $res->id;
                $pass_at = $res->pass_at;

                $this->info(‘查询‘ . $str_info . ‘有数据‘ . ‘:检查是否更新‘);
                $diff = strtotime($pass_at) - strtotime("+14 Days");
                $data_update = array();
                $data_update[‘pass_at‘] = date("Y-m-d", strtotime("+14 Days"));

                if ($diff < 0) {
                    $this->info(‘----需更新‘);
                    DB::connection(‘mining_db‘)
                        ->table($table_collect_listing_asins)
                        ->where(‘id‘, ‘=‘, $id)
                        ->update($data_update);
                } else {
                    $this->info(‘----不需更新‘);
                }
            }

        } catch (Exception $exception) {
            $this->info(‘db异常停止:‘ . $exception);
            $this->statHandler->scriptEnd(3);
        }

    }

}
                $diff = strtotime($pass_at) - strtotime("+14 Days");
                $data_update = array();
                $data_update[‘pass_at‘] = date("Y-m-d", strtotime("+14 Days"));
时间: 2024-11-07 03:58:53

14days laravel的相关文章

Laravel 5.4 中的异常处理器和HTTP异常处理实例教程

错误和异常是处理程序开发中不可回避的议题,在本地开发中我们往往希望能捕获程序抛出的异常并将其显示打印出来,以便直观的知道程序在哪里出了问题并予以解决,而在线上环境我们不希望将程序错误或异常显示在浏览器中(出于安全考虑),这个时候我们仍然要捕获异常,只不过不是显示到浏览器中,而是记录到日志中,方便日后排查问题. 百牛信息技术bainiu.ltd整理发布于博客园 Laravel当然支持PHP原生的错误和异常处理,但是在此基础上进行了一些封装处理,从而更方便在不同开发环境切换以及对错误和异常的处理.

laravel框架数据迁移

迁移就像数据库的版本控制,允许团队简单轻松的编辑并共享应用的数据库表结构,迁移通常和Laravel 的 schema 构建器结对从而可以很容易地构建应用的数据库表结构.如果你曾经告知小组成员需要手动添加列到本地数据库结构,那么这正是数据库迁移所致力于解决的问题. Laravel 的 Schema 门面提供了与数据库系统无关的创建和操纵表的支持,在 Laravel 所支持的所有数据库系统中提供一致的.优雅的.平滑的 API. laravel默认有两个文件uses  和 password_reset

详细说明php的4中开源框架(TP,CI,Laravel,Yii)

ThinkPHP简称TP,TP借鉴了Java思想,基于PHP5,充分利用了PHP5的特性,部署简单只需要一个入口文件,一起搞定,简单高效.中文文档齐全,入门超级简单.自带模板引擎,具有独特的数据验证和自动填充功能,框架更新速度比较速度. 优点:这个框架易使用 易学 安全 对bae sae支持很好提供的工具也很强大 可以支持比较大的项目开发 易扩展 全中文文档 总的来说这款框架适合非常适合国人使用 性能 上比CI还要强一些 缺点:配置对有些人来说有些复杂(其实是因为没有认真的读过其框架源码)文档有

Laravel 5.0 - Middleware (中间件)

图片:http://stackphp.com/ 如上图所示,中心的绿色区域是整个应用的核心区域. 所以,中间件就是一系列处理请求和响应的方式而不是你用程序逻辑的一部分. Laravel 中默认使用中间件处理请求中的加密解密,以及 Cookies 和 Sessions.你也可以自定义自己所需的中间件. 写中间件 artisan make:middleware MyMiddleware 执行上面的命令,生成中间件文件: <?php namespace App\Http\Middleware; use

laravel安装笔记

一.安装composer 安装之前将\php\php.ini文件中的php_openssl.dll扩展库开启,否则composer在安装过程中会出现错误提示. (我在安装过程中发现apache目录下的php.ini最好也开启php_openssl.dll,就是讲前面的‘:’号去掉) composer下载地址:https://getcomposer.org/ windows下载地址:https://getcomposer.org/Composer-Setup.exe 二.下载Laravel最新框架

Laravel 5.5 的自定义验证对象/类

本文和大家分享的主要是Laravel 5.5 的自定义验证对象/类相关内容,一起来看看吧,希望对大家学习Laravel有所帮助. Laravel 5.5 将提供一个全新的自定义验证规则的对象,以作为原来的 Validator::extend 方法的替代. Laravel 中的表单验证是比较方便的,而且内置了大量的可用验证规则,但不管官方提供了多少,总还是会有满足不了需求的时候.很多时候我们会直接用正则表达式来处理这种特殊的验证,也有时候我们会选择用 Validator::extend来扩展一个自

laravel 数据库操作小例子

public function demo() { $res = null; //insert数据插入 //$user=array('username'=>'joy','password'=>'123456','age'=>23); //$res = DB::table('users')->insert($user); /* 数据查询 $res = DB::table('users')->where('username','joy')->get(); $res = DB:

Laravel中常见的错误与解决方法小结

一.报错: 「Can't swap PDO instance while within transaction」 通过查询 Laravel 源代码,可以确认异常是在 setPdo 方法中抛出的: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <?php public function setPdo($pdo) {   if ($this->transactions >= 1) {     throw new RuntimeException("

Laravel学习基础篇之--路由

终于还是决定再多学一门重量级框架,当然首选必备还是被称为最优雅的Web开发框架--Laravel 对于框架的入门,首先了解它的路由规则是先前必备的,以下是laravel 中几种常见的基础路由规则 //基础路由//GETRoute::get('basic',function (){ return 'Im,GET'; }); //POSTRoute::post('basic2',function (){ return 'Im,Post'; }); //多请求路由(两种方式:match & any m