博主信息
博文 58
粉丝 3
评论 0
访问量 76663
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
laravel实战-批量插入万条记录时,发送post请求却报get请求不被支持(其实是请求执行超时)
岂几岂几
原创
1386人浏览过

laravel实战-批量插入万条记录时,避免超时

在laravel框架项目中使用PHPExcel从excel文件中读取了3万多条记录,要批量插入到数据库表中,报了下图的异常

明明提交的是$.post(...)请求,路由也是用Route::post(...),为什么还是提示我提交的不是post请求呢?
经西门老师提点,这很可能是服务器超时引起的,然后在导入数据的action做了以下测试:

  1. public function importVoteData(Request $req) {
  2. set_time_limit(0);
  3. // 尝试把时间分别设置为35,40,45,50
  4. sleep(50);
  5. return 'aaa';
  6. }

经过几次测试,发现每次请求的执行时间都是40秒左右,见下图:

自此,基本可以确定是超时引起的。然后做了以下设置:
tips:我本地使用的是phpstudy集成环境,在这里可以快速打开各种配置文件:

PHP设置(php.ini)

Apache设置(httpd.conf)

改完重启Apache,问题依旧,还是超过40秒报错。然后再做以下设置:
站点配置(域名.conf)

改完再重启Apache,终于可以突破40秒的限制了,但是直接使用laravel的批量插入操作插入3万多条数据,请求在执行7分多钟后,还是报错了:

$voteDatas数组中有3万多条数据↑

最后,修改批量插入代码,把3万多条数据拆分成小批量(2000条)依次插入,大功告成

  1. // 执行插入
  2. $voteDatasPart = [];
  3. $count = 0;
  4. foreach($voteDatas as $vd) {
  5. $voteDatasPart[] = $vd;
  6. // 分批量插入,每次插入2000条
  7. if(count($voteDatasPart) >= 2000) {
  8. DB::table('vote_data_ori')->insert($voteDatasPart);
  9. $count += count($voteDatasPart);
  10. // 插入完成,清空
  11. $voteDatasPart = [];
  12. }
  13. }
  14. // 插入最后少于2000条的数据
  15. if(count($voteDatasPart) > 0) {
  16. DB::table('vote_data_ori')->insert($voteDatasPart);
  17. $count += count($voteDatasPart);
  18. }

本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学