>백엔드 개발 >PHP 튜토리얼 >PHP로 내보낸 대용량 데이터를 최적화하는 방법

PHP로 내보낸 대용량 데이터를 최적화하는 방법

little bottle
little bottle앞으로
2019-04-23 11:22:072792검색

이 문서의 주요 목적은 PHP에서 내보낸 대규모 데이터를 최적화하는 것입니다. 필요한 참조 가치가 있습니다.

내보낸 데이터의 양이 많으면 Excel 생성에 필요한 메모리가 매우 커서 서버가 이를 감당할 수 없습니다. 이때 문제를 해결하려면 cvs의 읽기 및 쓰기 성능이 그보다 높습니다. 엑셀의.
시험 테이블 학생 데이터 (3백만 개가 넘는 시험 데이터를 삽입하는 스크립트가 가능합니다. 다음은 간단한 예입니다.)


SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `StuNo` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `StuName` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `StuAge` int(11) NULL DEFAULT NULL,
  PRIMARY KEY (`ID`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 12 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, 'A001', '小明', 22);
INSERT INTO `student` VALUES (2, 'A005', '小李', 23);
INSERT INTO `student` VALUES (3, 'A007', '小红', 24);
INSERT INTO `student` VALUES (4, 'A003', '小明', 22);
INSERT INTO `student` VALUES (5, 'A002', '小李', 23);
INSERT INTO `student` VALUES (6, 'A004', '小红', 24);
INSERT INTO `student` VALUES (7, 'A006', '小王', 25);
INSERT INTO `student` VALUES (8, 'A008', '乔峰', 27);
INSERT INTO `student` VALUES (9, 'A009', '欧阳克', 22);
INSERT INTO `student` VALUES (10, 'A010', '老顽童', 34);
INSERT INTO `student` VALUES (11, 'A011', '黄老邪', 33);

SET FOREIGN_KEY_CHECKS = 1;

내보내기 스크립트 import.php


<?php
set_time_limit(0);
ini_set(&#39;memory_limit&#39;, &#39;128M&#39;);

$fileName = date(&#39;YmdHis&#39;, time());
header(&#39;Content-Encoding: UTF-8&#39;);
header("Content-type:application/vnd.ms-excel;charset=UTF-8");
header(&#39;Content-Disposition: attachment;filename="&#39; . $fileName . &#39;.csv"&#39;);
//注意,数据量在大的情况下。比如导出几十万到几百万,会出现504 Gateway Time-out,请修改php.ini的max_execution_time参数
//打开php标准输出流以写入追加的方式打开
$fp = fopen(&#39;php://output&#39;, &#39;a&#39;);
//连接数据库
$dbhost = &#39;127.0.0.1&#39;;
$dbuser = &#39;root&#39;;
$dbpwd = &#39;root&#39;;
$con = mysqli_connect($dbhost, $dbuser, $dbpwd);
if (mysqli_connect_errno())
    die(&#39;connect error&#39;);

$database = &#39;test&#39;;//选择数据库
mysqli_select_db($con, $database);
mysqli_query($con, "set names UTF8");//如果需要请设置编码

//用fputcsv从数据库中导出1百万的数据,比如我们每次取1万条数据,分100步来执行
//一次性读取1万条数据,也可以把$nums调小,$step相应增大。
$step = 100;
$nums = 10000;
$where = "where 1=1"; //筛选条件,可自行添加
//设置标题
$title = array(&#39;id&#39;, &#39;编号&#39;, &#39;姓名&#39;, &#39;年龄&#39;); //注意这里是小写id,否则ID命名打开会提示Excel 已经检测到"xxx.xsl"是SYLK文件,但是不能将其加载: CSV 文或者XLS文件的前两个字符是大写字母"I","D"时,会发生此问题。
foreach ($title as $key => $item)
    $title[$key] = iconv("UTF-8", "GB2312//IGNORE", $item);
fputcsv($fp, $title);
for ($s = 1; $s <= $step; $s++) {
    $start = ($s - 1) * $nums;
    $result = mysqli_query($con, "SELECT ID,StuNo,StuName,StuAge FROM `student` " . $where . " ORDER BY `ID` LIMIT {$start},{$nums}");
    if ($result) {
        while ($row = mysqli_fetch_assoc($result)) {
            foreach ($row as $key => $item)
                $row[$key] = iconv("UTF-8", "GBK", $item); //这里必须转码,不然会乱码
            fputcsv($fp, $row);
        }
        mysqli_free_result($result); //释放结果集资源
        ob_flush();  //每1万条数据就刷新缓冲区
        flush();
    }
}
mysqli_close($con);//断开连接

내보내기 효과:

관련 튜토리얼: PHP 비디오 튜토리얼

위 내용은 PHP로 내보낸 대용량 데이터를 최적화하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제