踏浪


  • 首页

  • 分类

  • 标签

  • 归档

  • 搜索

PHP导出大数据到Excel

发表于 2017-06-29 | 分类于 PHP | | 阅读次数:

数据量很大时(5万条以上),用 PHPExcel 导出 xls 将十分缓慢且占用很大内存,最终造成运行超时或内存不足。
可以通过设置 PHP 的运行时间和内存限制来阻止错误发生,但仍然不能确保导出完成。

1
2
set_time_limit(0);
ini_set("memory_limit","512M");

一、 可生成多个链接分页进行导出

要彻底解决这个问题可以将数据分批导出成 CSV 格式的文件,这种格式简单导出快,并且也能用到 Excel 中。

我们用php提供的fputcsv来导出一百万的数据,原理就是打开一个标准输出流,然后把数据按一万条来分割,每一万条就刷新缓冲区。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?php
set_time_limit(0);
ini_set('memory_limit', '128M');

$fileName = date('YmdHis', time());
header('Content-Type: application/vnd.ms-execl');
header('Content-Disposition: attachment;filename="' . $fileName . '.csv"');

$begin = microtime(true);

//打开php标准输出流
//以写入追加的方式打开
$fp = fopen('php://output', 'a');

$db = new mysqli('127.0.0.1', 'root', '', 'test');

if($db->connect_error) {
die('connect error');
}

//我们试着用fputcsv从数据库中导出1百万的数据
//我们每次取1万条数据,分100步来执行
//如果线上环境无法支持一次性读取1万条数据,可把$nums调小,$step相应增大。
$step = 100;
$nums = 10000;

//设置标题
$title = array('ID', '用户名', '用户年龄', '用户描述', '用户手机', '用户QQ', '用户邮箱', '用户地址');
foreach($title as $key => $item) {
$title[$key] = iconv('UTF-8', 'GBK', $item);
}
//将标题写到标准输出中
fputcsv($fp, $title);

for($s = 1; $s <= $step; ++$s) {
$start = ($s - 1) * $nums;
$result = $db->query("SELECT * FROM tb_users ORDER BY id LIMIT {$start},{$nums}");

if($result) {
while($row = $result->fetch_assoc()) {
foreach($row as $key => $item) {
//这里必须转码,不然会乱码
$row[$key] = iconv('UTF-8', 'GBK', $item);
}
fputcsv($fp, $row);
}
$result->free();

//每1万条数据就刷新缓冲区
ob_flush();
flush();
}
}

$end = microtime(true);
echo '用时:', $end - $begin;

生成一个文件数据过大,可以生成下载链接进行单个导出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//表单
<form action="<?php echo $this->createUrl('/offlinead/default/index');?>" id="myform" method="get" >
<button type="button" class="btn btn-info" id="exportBtn">导出Excel</button>
</form>

// 导出excel js
$("#exportBtn").click(function () {
var params = $("#myform").serialize();
var url = "<?php echo $this->createUrl('/offlinead/default/index'); ?>";
//获取查询数据的条数
$.get(url+"?is_get_num=1&export=1&" + params, function(data) {
var downDataList = "";

if(data["rows"]) {
//rows是数据总条数,pageSize是一页多少条
var pageNum = Math.ceil(data["rows"] / data["pageSize"]);
for(var i = 1; i <= pageNum; ++i) {
downDataList += "<a href='"+url+"?export=1&" + params + "&page=" + i + "'>下载汇总结果" + i + "</a>&nbsp;&nbsp;";
}
$("#searchDataList").html(downDataList);
} else {
commonjs.alert("没有数据");
}
}, "json");
return false;
});

二、 生成多个文件到一个目录,打包导出

JS代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 var pageNum = 0; //总页数
// 导出excel
$("#exportBtn").click(function () {
var params = $("#myform").serialize();
var url = "<?php echo $this->createUrl('/offlinead/default/index'); ?>";

//获取查询数据的条数
$.get(url+"?is_get_num=1&export=1&" + params, function(data) {
if(data["rows"]) {
//rows是数据总条数,pageSize是一页多少条
pageNum = Math.ceil(data["rows"] / data["pageSize"]);
excel(1); //生成excel文件
console.log("正在生成第一页\n");

} else {
commonjs.alert("没有数据");
}
}, "json");
return false;
});
//生成csv文件
function excel(page) {
//向后台发送处理数据
$.ajax({
type: "POST",
dataType: "text",
url: '<?php echo Yii::app()->createUrl("/offlinead/default/index"); ?>?' + $("#myform").serialize() + '&export=1&page='+page, //分页生成excel地址
data: "",
error: function () {
commonjs.alert("下载失败");
},
success: function (data) {
if (data == 1) {
var nowpage = page+1;
if (nowpage <= pageNum+1) {
excel(nowpage);
// console.log("正在生成第"+nowpage+"页\n");
}
} else if(data == 0) {
commonjs.alert("下载失败");
}else{
location.href = data; //跳转到生成的zip包进行下载
}
}
});
}

PHP代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
$list = $this->getOrder($this->page,$this->pageSize);//当前页查询到的数据

if ($this->page <= $pagenum) { //当前页小于总页数,生成csv
$date = date("Ymd");
$p =$this->page;//当前页数
$filename = $this->_upload_path.$date."-".$p.'.csv';//$this->_upload_path生成文件路径
$this->exportCSVCommand($filename,$list);//生成csv
echo 1; //生成单页数据成功
}else{ //全部生成完以后,对生成目录进行打包
$zip=new ZipArchive();//php打包类,xxx.zip为压缩包文件名
if($zip->open($this->_upload_path.'xxx.zip', ZipArchive::OVERWRITE)=== TRUE){
$this->addFileToZip($this->_upload_path, $zip); //调用方法,对要打包的根目录进行操作,并将ZipArchive的对象传递给方法
$zip->close(); //关闭处理的zip文件
echo $this->_upload_path.'xxx.zip';//返回前端压缩包目录,进行下载
}else{
echo 0; //打包失败
}

}

//根据数组生成excel文件
public function exportArrayCommand($fileName, $array) {
$fp = fopen($fileName, 'w');
// 计数器
$cnt = 0;
// 每隔$limit行,刷新一下输出buffer
$limit = 10000;
// 逐行取出数据,不浪费内存
foreach ($array as $row) {
$cnt ++;
if ($limit == $cnt) { //刷新一下输出buffer,防止由于数据过多造成问题
ob_flush();
flush();
$cnt = 0;
}
foreach ($row as $i => $v) {
$row[$i] = iconv('utf-8', 'gb2312', $v);
}
fputcsv($fp, $row);
}
fclose($fp);
}


//将指定目录文件,加入到压缩文件对象
public function addFileToZip($path,$zip){
$handler=opendir($path); //打开当前文件夹由$path指定。
while(($filename=readdir($handler))!==false){
if($filename != "." && $filename != ".."){//文件夹文件名字为'.'和‘..’,不要对他们进行操作
if(is_dir($path.DIRECTORY_SEPARATOR.$filename)){// 如果读取的某个对象是文件夹,则递归
addFileToZip($path."/".$filename, $zip);
}else{ //将文件加入zip对象
$zip->addFile($path."/".$filename);
}
}
}
@closedir($path);
}

设置cmd命令提示符窗口的界面语言

发表于 2017-06-29 | | 阅读次数:

chcp 是 “change code page”的缩写,chcp命令查看当前代码页

安装代码

“chcp 437” 命令的作用是更改代码页。

安装代码

437 是美国英语的代码页
936 是中文的代码页,936就是cmd默认的代码页

PHPStorm 设置调试工具XDebug

发表于 2017-06-07 | 分类于 PHP | | 阅读次数:

安装XDebug

如果使用的PHP开发环境是phpStudy,本身已经安装了XDebug扩展,只需在php.ini中开启即可。

1
2
3
4
5
[XDebug]
xdebug.profiler_output_dir="D:\phpStudy\tmp\xdebug"
xdebug.trace_output_dir="D:\phpStudy\tmp\xdebug"
zend_extension="D:\phpStudy\php\php-5.5.38\ext\php_xdebug.dll"
xdebug.remote_enable = on

安装代码

如果没有安装,可以到 xdebug网站 下载相应版本的XDebug扩展php_xdebug.dll,只需将phpinfo的内容复制到输入框,第一种方式可以打印phpinfo(),复制网页内容,第二种方式在命令行将phpinfo的内容输出到文件中 php -i >phpinfo.txt ,复制phpinfo.txt的内容到输入框。最后点击按钮 Analyse my phpinfo() output 就会显示你要下载的版本。

安装代码

设置PHPStorm

一、 添加服务器信息

1、 进入File>Settings>Languages & Frameworks>PHP>Servers,根据自己的域名进行设置,www.xywang.net是我配置的要进行debug的域名。

安装代码

2、进入File>Settings>Languages & Frameworks>PHP>Debug>DBGp Proxy 填写:

1
2
3
IDE key: phpStorm 
host: www.xywang.net
port: 80

安装代码

3、最后点菜单栏的Run>Edit Configurations… 在弹出的窗口中添加一个调试配置:点击左上角加号,选择PHP Web Application,选择刚才配置的Server,选择默认浏览器为chrome

安装代码

二、安装chrome调试插件Xdebug helper

安装好后在浏览器右上角会有一个灰色的小甲虫,右键选项中设置IDE key为PhpStorm,调试时要选择Debug选项成为绿色。

安装代码
安装代码

开始调试

调试时,在phpstrom中设置好断点,并点击右上角开始监听调试按钮,最后刷新网页即可进行调试。

安装代码

python3.5安装加密模块pycrypto

发表于 2017-06-01 | 分类于 Python | | 阅读次数:

安装代码如下

1
pip install --use-wheel --no-index --find-links=https://github.com/sfbahr/PyCrypto-Wheels/raw/master/pycrypto-2.6.1-cp35-none-win_amd64.whl pycrypto

Hexo的NexT主题:添加来必力评论

发表于 2017-05-26 | 分类于 Hexo | | 阅读次数:

来必力是什么?

使用社交网站账户登录,免去注册过程。
提高用户的参与和沟通意愿。
管理/删除我的评论内容。
提供管理页面,管理网站文章及评论内容。

安装来必力

1 、登陆来必力网站注册

2 、在后台的代码管理页面 查看一般网站的安装代码,复制data-uid的值

安装代码

3、打开next主题的配置文件 \themes\next_config.yml,找到 livere_uid 设置为该值即可。

1
2
3
# Support for LiveRe comments system.
# You can get your uid from https://livere.com/insight/myCode (General web site)
livere_uid: 这里填写data-uid的值

基本设置

1 、注意需要在来必力后台管理的设置中添加网站名称和网站的URL,可根据情况选择要显示的SNS第三方登陆按钮。

安装代码

2、评论提醒:在评论提醒开启登记新评论时,接受提醒,填写接受提醒的邮箱地址以及选择提醒周期。

3、评论管理中可针对接收到的评论进行管理。

Hexo的NexT主题:显示网站访问人数和总访问量

发表于 2017-05-18 | 分类于 Hexo | | 阅读次数:

显示统计标签

打开\themes\next\layout_partials\footer.swig文件,复制以下代码至你想要放置的位置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<div class="busuanzi-count">
<script async="" src="https://dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js"></script>

<span class="site-uv">
<i class="fa fa-user"> 本站访客数</i>
<span class="busuanzi-value" id="busuanzi_value_site_uv"></span>
人
</span>

<span class="site-pv">
<i class="fa fa-eye"> 本站总访问量</i>
<span class="busuanzi-value" id="busuanzi_value_site_pv"></span>
次
</span>

</div>

Hello World

发表于 2017-04-12 | | 阅读次数:

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

1…34
踏浪

踏浪

37 日志
12 分类
13 标签
GitHub
Links
  • yangxianci
© 2019 踏浪
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4
本站访客数 人 本站总访问量 次