最近在做一个爬虫的一个模块,遇到了当你爬取100多张网络图片的时候可以下到50~90多张发现会出现500错误
问了群里面的大佬说是请求过长了导致的,或者是内部代码错误,前面的都可以下载,就是时间长了就会出现错误,然后请教群里的大佬解决方案,有redis的队列的,laravel队列的,我是用laravel框架的队列现在贴跟步骤代码,先创建一个laravel项目,创建项目跟运行省略
**
工具/原料
**
laravel5.6 & composer & lnmp环境
php7.2.x+
方法/步骤
首先检查自己的环境是否符合要求
php -v
composer --version
我的是用数据库队列的所以需要改配置文件.env文件的 QUEUE_DRIVER=database
我们使用laravel提供的脚手架生成处理队列的任务类DemoQueue
php artisan make:job DemoQueue
这个时候会在你的项目下面多了一个Jobs目录,最终生成的任务处理文件就在目录下面
处理队列的任务类,但是现在我们还没有要处理的队列,那么我们接着使用laravel提供的脚手架生成队列使用的数据库
//查看laravel提供了那些脚手架功能
php artisan
//使用php artisan queue:table 生成数据队列驱动的表结构
php artisan queue:table
//执行数据库迁移也就是创建表
php artisan migrate
执行完上面的动作之后,如果你前面的数据配置正确,那么你应该和我一样会看到图片上的效果
数据表也有,那么模拟几条队列数据到队列里面去,那么就随便创建一个控制来模拟几条数据到队列服务里面去.
//生成控制器
php artisan make:controller DemoController
//启动一个内部虚拟服务器
php artisan serve
//配置web.php的请求路由
Route::get('demo','DemoController@demo');
//新开一个窗口用curl请求
curl -i localhost:8000/demo
如果不出意外的话,这个时候jobs表里面就有了三条待处理的消息了
消费队列,前面都好理解就是在消费队列的时候,有几个小坑大家要注意,因为在消费队列的时候谁都不能保证服务就一直在如期执行,总会发生点什么意外.有人说可以用try catch捕获,但是不是这样的,即使你在DemoQueue里面捕获,你也拿回去不到异常信息, 跟踪源码发现,是在队列的接口在进行了捕获, 那我们先不考虑错误的情况, 就假如一切都很顺利的执行了
//执行这个命令消费队列
php artisan queue:work --queue=demo
出现这个说明它已经执行了
如果出现错误的话
这个表的jobs表的数据也会被删除
但是数据会记录在
//执行如下命令找回处理失败的队列
php artisan queue:all
后面可以跟failed-table表的id,如果跟id的话, 只会回复对应id值的失败队列到jobs表中, 如果跟all的话全部失败的队列都会重新放回jobs表中
这是我简化版的 转载了 https://blog.csdn.net/william_n/article/details/103425410,方便自己记忆所以写这篇博客,我自己亲自测试 是成功的,最后下载网络图片也可以比之前下得完,貌似还更快,有机会有学习redis队列,不喜勿喷,谢谢