PHP导出数据超时怎么办?教你三个方法

Admin 2021-09-01 群英技术资讯 884 次浏览

    PHP导出数据超时怎么办?一般来说PHP导出数据超时可能是sql语句复杂,查询时间过长、处理查询后数据逻辑冗余和数据量过大导致响应超时这三种情况造成的,想要解决超时问题优化必不可少,因此我们可以从这三方面入手优化。

    一、sql语句复杂,查询时间过长

  1、查看索引是否设置妥当,即所用的查询条件是否有添加索引,当然索引不是越多越好,只需给常用的查询条件加上即可,一般采用B+树的索引方式(具体原因可自行百度,不再赘述)
  2、在查询语句中尽量避免IN、NOT IN、IS NULL、OR、!=、<>、LIKE、OR、NOT EXISTS这些查询条件的出现,会导致索引失效。
- IN查询时,可以考虑用BETWEEN来代替
- LIKE查询时,仅当"%"在前时会索引失效,"%"在后是不会失效的
- 查询条件里还要避免数字的出现,使用字符串,数字也会导致索引失效,例如,查询:"pid"=1,可以优化为"pid"="1"
- 要尽量避免在循环中使用查询语句,这种情况一般可以用join或者with来解决(当涉及到跨库时,请谨慎使用这种方式!)
- 查询时,可以指定需要查询的字段,排除掉不需要的字段避免资源浪费
- 当数据量多大时,可以使用分页和缓存来优化(具体方法请参考数据量过大导致响应超时部分)
    温馨提示:在执行查询语句后,可以通过show profiles来查询语句的资源消耗情况来帮助你更好的优化sql语句;关于查询语句是否使用了索引,可以在查询语句前加explain来查看索引使用情况,例如:
explain select * from user where id= '1';

    二、处理查询后数据逻辑冗余

- 在做数组循环时,尽量使用continue、break来减少没必要的循环;

- 尽量减少if嵌套层数,在需要用到多个if-else时,使用switch可以提高效率,特别是在数据量大时
- 当进行数组赋值时,
  一次赋一个值,使用$arr[]=1,会比array_push($arr,"1"),更快,
  但是当需要多次赋值时,
    array_push($arr,"1","2","3",...),会比
    $arr[]="1";
    $arr[]="2"
    $arr[]="3"
    ...
  更快
  
- 遍历数组进行赋值时,尽量使用引用的方式,减少内存开销,例如:
  
    foreach($arr as &$item){
      $item = 1;
      ...
    }

    三、数据量过大导致响应超时

    当数量两过大,又不想用异步的方式导出excel文件时,可以尝试使用csv来作为到处格式,且查询导出数据时可以使用分页的方式查询,导出时利用ob_flush进行缓存。例如:

$page = 1;    // 页面
$pageSize = 1000;    //每页条数
while(
  $list = Db::name("user")->page($page)->limit($pageSize)->select()
)
{
  foreach($list as &$item){
    // TODO 进行相应的逻辑处理
  }
  $page++;
}

    当数据访问次数过多时,建议使用redis缓存一些固定数据,减少mysql查询次数。最好的方式还是使用异步的方式导出,建议使用python或者go语言搭建微服务来进行导出。

    关于PHP导出数据超时情况以及优化方法就介绍到这,有需要的朋友可以参考上文几种方法,希望能对大家有帮助,想要了解更多大家可以关注群英网络其它相关文章。

文本转载自脚本之家

群英智防CDN,智能加速解决方案

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

猜你喜欢

成为群英会员,开启智能安全云计算之旅

立即注册
专业资深工程师驻守
7X24小时快速响应
一站式无忧技术支持
免费备案服务
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
在线客服
微信公众号
返回顶部
返回顶部 返回顶部
在线客服
在线客服