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 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

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的定时任务添加。
更多关于Laravel的任务调度,请看考该文:Laravel 的任务调度(计划任务)功能 Task Scheduling
原文地址:https://segmentfault.com/a/1190000015968429
Laravel5.5 综合使用的更多相关文章
- 【技术博客】 关于laravel5.1中文件上传测试的若干尝试
		
关于laravel5.1中文件上传测试的若干尝试 作者:ZGJ 版本:v1.0 PM注:本人这两天也正在尝试解决这一问题,如有进展将及时更新这一博客 在我们的软工第二阶段中,我开始着手进行后端控制器的 ...
 - AEAI DP V3.6.0 升级说明,开源综合应用开发平台
		
AEAI DP综合应用开发平台是一款扩展开发工具,专门用于开发MIS类的Java Web应用,本次发版的AEAI DP_v3.6.0版本为AEAI DP _v3.5.0版本的升级版本,该产品现已开源并 ...
 - H5+JS+CSS3 综合应用
		
慕课网新教程H5+JS+CSS3 实现的七夕言情主题效果已经出炉了 从设计到实现到录制与编写用了快1个月的时间,说真的这个案例是慕课定制的,我之前也没有系统的做过这样的一个效果,在实现的时候自己也重新 ...
 - [教程] [授权翻译] 使用补丁修改DSDT/SSDT [DSDT/SSDT综合教程]
		
[教程] [授权翻译] 使用补丁修改DSDT/SSDT [DSDT/SSDT综合教程] http://bbs.pcbeta.com/viewthread-1571455-1-1.html [教程] [ ...
 - laravel5 安装笔记
		
1.环境更新 apt-get update apt-get install php5-cli apt-get install curl 2. Composer安装 curl -sS https://g ...
 - Laravel5路由/home页面无法访问
		
报错信息: Not Found The requested URL /laravel5/public/home was not found on this server. 解决方法: 1.编辑apac ...
 - Laravel5.0学习--03 Artisan命令
		
本文以laravel5.0.22为例. 简介 Artisan 是 Laravel 内置的命令行接口.它提供了一些有用的命令协助您开发,它是由强大的 Symfony Console 组件所驱动.利用它, ...
 - iOS--知识综合应用成就时髦小功能点
		
iOS--知识综合应用成就时髦小功能点
 - Oracle 数据库基础学习 (七)  SQL语句综合练习
		
一.多表查询综合练习 1. 列出高于在30部门工作的所有人员的薪金的员工的姓名.部门名称.部门编号.部门人数 分析: 需要的员工信息: |-emp表:姓名.部门编号 |-dept表:部门名称.部门编 ...
 
随机推荐
- 分享一个全开源的ASP.NET快速开发平台,能快速开发OA CRM ERP 等系统
			
bingo炸了 2017/3/30 16:28:14 阅读(870) 评论(0) 公司业务量比较大,接了很多项目,为了缩短开发周期老板让我牵头搭建了一个快速开发平台. 我们主要的业务是做OA.CRM. ...
 - oracle从子表取出前几行数据:
			
取排序后的前几行,应该用: select * from(select * from test order by stamp desc) where rownum<= 6 (表示排序后取前几行) ...
 - 使用HttpClient MultipartEntityBuilder 上传文件,并解决中文文件名乱码问题
			
遇到一种业务场景,前端上传的文件需要经过java服务转发至文件服务.期间遇到了原生HttpClient怎么使用的问题.怎么把MultipartFile怎么重新组装成Http请求发送出去的问题.文件中文 ...
 - 内核的ramdisk
			
ramdisk 内核中的特性之一,使用缓冲和缓存来加速对磁盘上的文件访问,并加载相应的硬件驱. ramdisk --> ramfs,提高速度 CentOS 5: initrd 工具程序:mkin ...
 - SSH协议、HTTPS中SSL协议的完整交互过程
			
1.(SSH)公私钥认证原理 服务器建立公钥:每一次启动sshd服务时,该服务会主动去找/etc/ssh/ssh_host*的文件 客户端通过ssh工具进行连接,如Xshell,SecureCRT 服 ...
 - xshell、xftp最新版下载方法
			
https://www.netsarang.com/download/main.html 登录邮箱打开第一个下载地址进行下载
 - 转 Shell调试篇
			
检查语法 -n选项只做语法检查,而不执行脚本. sh -n script_name.sh 启动调试 sh -x script_name.sh 进入调试模式后,Shell依次执行读入的语句,产生的输出中 ...
 - 流式套接字(SOCK_STREAM),数据报套接字 (SOCK_DGRAM) 的比较
			
1.流式套接字 使用这种套接字时,数据在客户端是顺序发送的,并且到达的顺序是一致的.比如你在客户端先发送1,再发送2,那么在服务器端的接收顺序是先接收到1,再接收到2,流式套接字是可靠的,是面向连接的 ...
 - RabbitMQ一:消息队列的认识
			
1异步处理 场景说明:用户注册后,需要发注册邮件和注册短信.传统的做法有两种1.串行的方式:2.并行方式. (1)串行方式:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信.以上三个任务全部完 ...
 - 项目需求会__前端er定位的思考~
			
一.页面展示-----针对前端部分:后台的东西(功能.样式)不考虑! 二.动态效果------能不能实现! 三.接口数据------怎么传数据! 四.兼容性--------兼容到哪个版本浏览器! 五. ...