使用 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 Monolog\Logger;
use Monolog\Handler\StreamHandler;

// 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 App\Console\Commands;

use Goutte\Client as GoutteClient;
use GuzzleHttp\Client as GuzzleClient;
use GuzzleHttp\Pool;
use Illuminate\Console\Command;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;

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


Laravel5.5 综合使用_php

2.项目中添加定时命令

在 ​​App\Console\Kernel​​ 类的 ​​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的定时任务添加。