zoukankan      html  css  js  c++  java
  • Laravel5.5 综合使用

    使用 Laravel5.5 开发一个自动交割的项目,把使用到的开源扩展包及特性整理起来,以供后续使用。

    一、安装IDE提示工具

    Laravel IDE Helper 是一个极其好用的代码提示及补全工具,可以给编写代码带来极大的便利。

    1、安装

    
    # 如果只想在开发环境安装请加上 --dev
    composer require barryvdh/laravel-ide-helper
    

    安装 doctrine/dbal 「请装上它,在为模型注释字段的时候必须用到它」

    
    # 如果只想在开发环境安装请加上 --dev
    composer require "doctrine/dbal: ~2.3"
    

    详细安装方法,请参考这篇博文: Laravel 超好用代码提示工具 Laravel IDE Helper

    三个常用命令

    • php artisan ide-helper:generate - 为 Facades 生成注释
    • php artisan ide-helper:models - 为数据模型生成注释
    • php artisan ide-helper:meta - 生成 PhpStorm Meta file

    二、Monolog日志包

    日志的重要程度不言而喻, 不管是在开发过程中, 还是部署到生产环境后, 都是经常使用的.
    随着 psr-3 的出现, 终于统一了 php 中日志的风格.但是, 好用的记录日志系统, 也很重要.
    monolog 是我遇到的最好的日志系统.而且, laravel 中也是用的 monolog

    安装

    
    composer require monolog/monolog
    

    用法

    Github地址:monolog/monolog

    
    <?php
    
    use MonologLogger;
    use MonologHandlerStreamHandler;
    
    // create a log channel
    $log = new Logger('name');
    $log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));
    // $logger->pushHandler(new StreamHandler(storage_path() . '/logs/spider.log'));
    
    // add records to the log
    $log->warning('Foo');
    $log->error('Bar');
    
    

    三、抓包工具

    Guzzle 是一个十分强大的php的模拟HTTP client的第三方库,可以通过composer安装

    Goutte 是一个用来解析HTML文档的第三方库,可以通过composer安装

    安装

    
    composer require fabpot/goutte
    composer require guzzlehttp/guzzle
    

    创建命令

    
    php artisan make:command Spider
    

    命令参数

    
    // concurrency为并发数 keyWords为查询关键词
    protected $signature = 'command:spider {concurrency} {keyWords*}'; 
    

    实战

    
    <?php
    
    namespace AppConsoleCommands;
    
    use GoutteClient as GoutteClient;
    use GuzzleHttpClient as GuzzleClient;
    use GuzzleHttpPool;
    use IlluminateConsoleCommand;
    use MonologLogger;
    use MonologHandlerStreamHandler;
    
    class Spider extends Command
    {
    
        private $totalPageCount;
        private $counter        = 1;
        private $concurrency    = 7;  // 同时并发抓取
        private $logger         = null;
    
        private $urls = [
            'https://www.feixiaohao.com/currencies/bitcoin/', // BTC
            'https://www.feixiaohao.com/currencies/decred/',  // DCR
        ];
    
        /**
         * The name and signature of the console command.
         *
         * @var string
         */
        protected $signature = 'test:spider-request'; //concurrency为并发数  keyWords为查询关键词
    
    
        /**
         * The console command description.
         *
         * @var string
         */
        protected $description = 'php spider';
    
        /**
         * Create a new command instance.
         *
         * @return void
         */
        public function __construct()
        {
            parent::__construct();
        }
    
        /**
         * Execute the console command.
         *
         * @return mixed
         */
        public function handle()
        {
            // 实例化一个日志实例, 参数是 channel name
            $logger = new Logger('spider');
            $logger->pushHandler(new StreamHandler(storage_path() . '/logs/spider.log'));
            $this->totalPageCount = count($this->urls);
    
            $guzzleClent = new GuzzleClient();
            $client = new GoutteClient();
    
            $client->setClient($guzzleClent);
    
            $request = function ($total) use ($client){
                foreach ($this->urls as $url){
                    yield function () use($client, $url){
                        return $client->request('GET',$url);
                    };
                }
            };
    
            // @DOC http://docs.guzzlephp.org/en/stable/quickstart.html?highlight=pool
            // /Users/kaiyiwang/Code/digcoin/vendor/symfony/dom-crawler/Crawler.php
            $pool = new Pool($guzzleClent,$request($this->totalPageCount), [
                'concurrency' => $this->concurrency,
                'fulfilled' => function ($response, $index) use ($logger){
                    $res = $response->html();
                     // print_r($res);
    
                    $logger->info($res);
    
                    $this->info("请求第 $index 个请求,连接 " . $this->urls[$index]);
    
                    $this->countedAndCheckEnded();
                },
                'rejected' => function ($reason, $index){
                    $this->error("rejected" );
                    $this->error("rejected reason: " . $reason );
                    $this->countedAndCheckEnded();
                },
            ]);
    
            // 开始发送请求
            $promise = $pool->promise();
            $promise->wait();
    
        }
    
        public function countedAndCheckEnded()
        {
            if ($this->counter < $this->totalPageCount){
                $this->counter++;
                return;
            }
            $this->info("请求结束!");
        }
    
        // 运行命令:php artisan test:spider-request
    }
    
    

    四、定时任务

    CRON是一个守护进程,它驻留在你的linux服务器中,大部分时间都没有唤醒,但是每一分钟它都会睁开双眼,看看是否运行任何给定的任务,你使用crontab文件与该守护进程通信,在大多数常见的设置文件可以位于/etc/crontab,crontab文件可能看起来像这样:

    
    0 0 1 * * /home/full-backup
    0 0 * * * /home/partial-backup
    30 5 10 * * /home/check-subscriptions
    

    1.添加系统定时任务

    在laravel中添加定时任务很简单,首先在系统crontab 添加一个artisan的定时任务,每分钟执行一次。

    
    > crontab -e
    
    // /home/vagrant/Code/digcoin/ laravel项目在服务器的地址
     * * * * * php /home/vagrant/Code/digcoin/artisan schedule:run >> /dev/null 2>&1
    

    2.项目中添加定时命令

    AppConsoleKernel 类的 schedule 方法中定义预定的命令:

    
     protected function schedule(Schedule $schedule)
        {
            // $schedule->command('inspire')
            //          ->hourly();
    
            // php artisan test:spider-request, 每十分钟调用一次
            $schedule->command('test:spider-request')
                ->everyFifteenMinutes()->withoutOverlapping();
        }
    

    添加好了之后,我们可以直接使用这个命令测试定时任务是否可以执行:

    
    > php /home/vagrant/Code/digcoin/artisan test:spider-request
    

    OK,只需要简单的两步便可实现laravel的定时任务添加。

    更多关于Laravel的任务调度,请看考该文:Laravel 的任务调度(计划任务)功能 Task Scheduling

    原文地址:https://segmentfault.com/a/1190000015968429

  • 相关阅读:
    08 字体属性设置-font-family
    函数-函数进阶-生成器调用方法
    函数-函数进阶-斐波那契
    函数-函数进阶-列表生成式
    函数-函数进阶-装饰器带参数2
    函数-函数进阶-装饰带参数的函数
    函数-函数进阶-装饰器流程分析
    函数-函数进阶-装饰器
    函数-函数进阶-闭包
    函数-函数进阶-作用域的查找空间
  • 原文地址:https://www.cnblogs.com/lalalagq/p/9975233.html
Copyright © 2011-2022 走看看