legend3---laravel脚本运行40s报错
legend3---laravel脚本运行40s报错
一、总结
一句话总结:
【代码逻辑错误】:录入博客稍有问题就报错return,这样就【直接return到最外层的load_blog】,所以在load_blog中接下来执行的时候【就没有参数】了,所以就出错了
1、调试bug比较好的方式?
在日志中【打印中间结果】,如果想要自己结果显示更方便,可以用【自定义日志】
2、【循环中,不要直接return数据】?
循环中,不要直接return数据,可以等【循环完后,统计数据】
二、laravel脚本运行40s报错
1、现象
录入博客的时候脚本运行40s稳定报错,如下图:
原因是【load_blog方法被重复运行】,在第40s的时候load_blog方法重复执行,不过第二次运行的时候没有传过去的日期数据,所以这里报错
因为是录入博客数据,爬取多篇博客比较耗费时间,所以在程序中设置了脚本不限时
set_time_limit(0);
但是laravel对脚本或者方法时长应该还有其它设置,照上面的现象,【估计是方法超时了会重复执行】
可以看到load blog等方法被执行了两次,第一次有日期参数,第二次没有,所以第二次就停了,报LoadBlogEntrance错误
2、检查脚本是不是被超时关闭
可以在执行的方法中加入如下代码:
for ($i=0;$i<10000*10000;$i++){ if($i%1000==0) dump($i); }
循环到10000*10000,所花时间为5.5min,且并没有被异常关闭
如此结果证明脚本不是被超时关闭,更像是被laravel机制重复执行了方法
并且当加了300W次循环之后,执行时间稳定在52s
3、使用队列还是有同样的问题
4、可以看到是服务器内部错误,其实问题应该是【代码写的有问题】
【估计是有出错就返回的代码逻辑有问题】
解决思路应该是好好调整一下录取博客逻辑
5、问题原因
录入博客稍有问题就报错return,这样就直接return到最外层的load_blog,所以load_blog的时候就没有参数了,所以就出错了
看这份日志信息,其实挺明确的