php 는 fputcsv 를 사용 하여 빅 데이터 내 보 내기 작업 에 대한 상세 한 설명 을 실현 합 니 다.

본 고 는 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>&nbsp;&nbsp;";
        }
        $("#searchDataList").html(downDataList);
      } else {
        $("#searchDataList").text("    ");
      }
    }, "json");
    return false;
  });
</script>
더 많은 PHP 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 논문 에서 말 한 것 이 여러분 의 PHP 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기