tp6 大数据导出

日期:2020-07-28 浏览:31次
public function test_down()
    {
        //$sql = 'SELECT id,ArticleClassify,ArticleTitle FROM `test_yield`  where id < 1200000';
        $sql = 'SELECT * FROM `menber` ORDER BY m_id asc';
        $mark = 'test';
        $this->putCsv($sql,$mark);
    }
    /*
     * 该方法是把数据库读出的数据进行CSV文件输出,能接受百万级别的数据输出,因为用生成器,不用担心内存溢出。
     * @param string $sql 需要导出的数据SQL
     * @param string $mark 生成文件的名字前缀
     *
     */
    public function putCsv($sql, $mark)
    {
        //使用ajax 可以直接后台调用
        /*set_time_limit(0); // 取消脚本运行时间的超时上限
        ignore_user_abort(true); // 后台运行
        ini_set('max_execution_time', '0');//超时时间
        ini_set('memory_limit', '-1');//内存*/

        $file_num = date('YmdHis');  //文件名计数器
        $fileNameArr = array();
        $fp = fopen($mark .'_'.$file_num .'.csv', 'w'); //生成临时文件
        $fileNameArr[] = $mark .'_'.$file_num .'.csv';
        fwrite($fp, chr(0xEF).chr(0xBB).chr(0xBF));//转码,防止乱码
        foreach ($this->query($sql) as $a) {
            fputcsv($fp, $a);
        }
        fclose($fp);  //每生成一个文件关闭
    }

    //生成器来缓存mysql查询结果,返回类型为数组
    public function query($sql){
        $con = mysqli_connect("127.0.0.1", "www.tp6.com", "www.tp6.com");
        if (!$con) {
            die('Could not connect: ' . mysqli_error());
        }
        mysqli_select_db($con, "www.tp6.com");
        mysqli_query($con,'set names utf8');
        $n = 0;
//    print_r(mysqli_query($con, $sql,MYSQLI_USE_RESULT) ); mysqli_result Object 返回
        //该处用MYSQLI_USE_RESULT 就是不缓存结果集中,也是为了避免内存溢出,相当于mysql_unbuffered_query
        foreach (mysqli_query($con, $sql,MYSQLI_USE_RESULT) as $row ){  //
            yield $row;
        }
        $con->close();
    }

没有评论

发表评论