php 는 fputcsv 를 사용 하여 빅 데이터 내 보 내기 작업 에 대한 상세 한 설명 을 실현 합 니 다.
빅 데이터 내 보 내기 실험 을 위해 서,우 리 는 먼저 큰 표를 만 들 었 습 니 다.표 구 조 는 다음 과 같 습 니 다.
CREATE TABLE `tb_users` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT ' ID',
`name` varchar(32) DEFAULT '' COMMENT ' ',
`age` tinyint(3) DEFAULT '0' COMMENT ' ',
`desc` varchar(255) DEFAULT '' COMMENT ' ',
`phone` varchar(11) DEFAULT '' COMMENT ' ',
`qq` varchar(16) DEFAULT '' COMMENT ' QQ',
`email` varchar(64) DEFAULT '' COMMENT ' ',
`addr` varchar(255) DEFAULT '' COMMENT ' ',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
그리고 php 스 크 립 트 를 써 서 이 표 에 데 이 터 를 삽입 합 니 다.코드 는 다음 과 같 습 니 다.
<?php
set_time_limit(0);
ini_set('memory_limit', '128M');
// TP3.2 String ,php7 ,
require './String.class.php';
use Org\Util\NewString;
$begin = microtime(true);
$db = new mysqli('127.0.0.1', 'root', '', 'test');
if($db->connect_error) {
die('connect error');
}
//
$insSql = '';
// , 200 , 5000
$step = 200;
$nums = 5000;
for($s = 0; $s < $step; ++$s) {
$insSql = 'INSERT INTO tb_users VALUES';
for($n = 0; $n < $nums; ++$n) {
$name = NewString::randString(3, 4);
$age = mt_rand(1, 120);
$desc = NewString::randString(64, 4);
$phone = NewString::randString(11, 1);
$qq = NewString::randString(13, 1);
$email = $qq . '@qq.com';
$addr = NewString::randString(128, 4);
$insSql .= "(NULL, '{$name}', $age, '{$desc}', '{$phone}', '{$qq}', '{$email}', '{$addr}'),";
}
$insSql = rtrim($insSql, ',');
$db->query($insSql);
}
$end = microtime(true);
echo ' :', $end - $begin;
$db->close();
안에 사 용 된 TP 3.2 의 String 류 는 모두 스스로 TP 홈 페이지 에 올 라 가 다운로드 합 니 다.전체 사용 시간 은 2 시간 여 이 며,마지막 데이터 크기 는 662 M 이다.현재 우 리 는 php 가 제공 하 는 fputcsv 로 이 백만 개의 데 이 터 를 내 보 냅 니 다.원 리 는 표준 출력 흐름 을 열 고 데 이 터 를 만 개 로 나 누 어 만 개 당 버퍼 를 새로 고 치 는 것 입 니 다.
<?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;
전체 프로 세 스 가 5 분 동안 최종 적 으로 생 성 된 csv 파일 크기 420 M 입 니 다.phopexcel 로 빅 데 이 터 를 내 보 내 는 방법 에 대해 서 는 좋 은 방안 이 없습니다.phopexcel 이 제공 하 는 캐 시 방법,데이터 압축,메모리 사용 이 작 지만 사용 하 는 시간 은 길 어 지고 시간 은 공간 을 바 꾸 는 것 이 가장 좋 은 방안 이 아 닙 니 다.비교적 믿 을 만 한 방법 은 여러 개의 다운로드 링크 주 소 를 만 들 고 다운로드 할 데 이 터 를 get 형식 으로 현재 페이지 수 를 전달 하고 배경 에서 데이터 페이지 를 나 누 어 내 보 내 는 것 입 니 다.
<a href="/downSearchData.php? 1= 1& 2= 2&page=1" rel="external nofollow" > 1</a>
<a href="/downSearchData.php? 1= 1& 2= 2&page=2" rel="external nofollow" > 2</a>
<a href="/downSearchData.php? 1= 1& 2= 2&page=3" rel="external nofollow" > 3</a>
예 를 들 어 검색 데이터 폼 이 있 습 니 다.ID 는 searchFrm 입 니 다.그리고 내 보 내기 데 이 터 를 1 만 개 로 나 누고 싶 습 니 다.(phopexcel 은 한 번 에 1 만 개 를 내 보 내 는 것 은 문제 가 없고 효율 은 괜 찮 습 니 다)
<form id="searchFrm">
<input type="text" name="uname">
<input type="button" id="searchDataBtn" value=" ">
</form>
<div id="searchDataList"></div>
<script type="script">
$("#searchDataBtn").on("click", function() {
var params = $("#searchFrm").serialize();
//
$.get("/getSearchDataRows?" + 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='/downSearchData.php?'" + params + "&page=" + i + "> " + i + "</a> ";
}
$("#searchDataList").html(downDataList);
} else {
$("#searchDataList").text(" ");
}
}, "json");
return false;
});
</script>
더 많은 PHP 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.본 논문 에서 말 한 것 이 여러분 의 PHP 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Laravel - 변환된 유효성 검사 규칙으로 API 요청 제공동적 콘텐츠를 위해 API를 통해 Laravel CMS에 연결하는 모바일 앱(또는 웹사이트) 구축을 고려하십시오. 이제 앱은 CMS에서 번역된 콘텐츠를 받을 것으로 예상되는 다국어 앱이 될 수 있습니다. 일반적으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.