解决场景 :
在后台的时候出现了大数据导出EXCEL表, 或者其他的时候, 会出现因为查询太复杂, 处理太慢, 导致出现页面超时甚至服务器卡死的状况. (一般PHP导出只限制30秒).
现在会出现几个方案
1: 优化SQL语句
2: 按照逻辑分开多个EXCEL导出
3: 配合前端懒查询
等等 ......
其实如果优化到上述几点,很多时候因为业务逻辑的问题,也没能有更好的变化
所以现在有一个更好的思路是把每次导出变成任务方式, 让服务器单独去处理.再生成一个问题. 让用户自行去下载.
1: 数据库
CREATE TABLE data_export
(
id
int(11) unsigned NOT NULL AUTO_INCREMENT,
name
varchar(50) NOT NULL COMMENT '导出名字',
export_time
int(10) unsigned NOT NULL DEFAULT '0' COMMENT '导出数据时间',
start_time
int(10) unsigned NOT NULL DEFAULT '0' COMMENT '导出开始时间',
finish_time
int(10) unsigned NOT NULL DEFAULT '0' COMMENT '导出完成时间',
admin_id
int(10) unsigned NOT NULL DEFAULT '0' COMMENT '导出人管理员ID',
export_param
text NOT NULL COMMENT '导数据参数',
status
tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '导出状态: 0:未导出;1:导出中;2:已导出;3:导出结果已删除;4:导出错误',
file_path
varchar(500) NOT NULL DEFAULT '' COMMENT '导出结果地址',
PRIMARY KEY (id
)
) ENGINE=InnoDB AUTO_INCREMENT=153 DEFAULT CHARSET=utf8;
2: 把筛选条件, 与控制器模型方法入库, 状态设置
3: 写一个服务器脚本,使用事务 查看状态为未导出的, 去处理这个任务, 把EXCEL表放在指定地方.
4: 后台新增一个数据下载功能.
5: 为了防止服务器因为多个EXCEL出现容量爆了的问题, 写一个定时脚本, 定期清理一下旧的EXCEL文件
这样一个优化, 减低了用户体验, 却优化了服务器压力问题.