资讯专栏INFORMATION COLUMN

PHP利用PDO从mysql读取大量数据处理(可做大量数据集的导出,业务调整等)

宋华 / 872人阅读

摘要:环境适用场景需要处理一定数据集业务从读取一定数据的业务导出一次需要处理一定的业务操作更新删除等更多需要处理一定数据集的操作关键设置关键设置,如果不设置,依旧会从一次取出数据到里的游标属性不是必须的生成器生成器,迭代数据操作本生成器可

环境

mysql: 5.6.34
php: 5.6
nginx: php-fpm

适用场景
需要处理一定数据集业务

从mysql读取一定数据的业务导出

一次需要处理一定的mysql业务操作更新删除等

更多需要处理一定数据集的操作

pdo 关键设置
$dbh = new PDO($dsn, $user, $pass);
# 关键设置,如果不设置,php依旧会从pdo一次取出数据到php
$dbh->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
//perpare里的游标属性不是必须的
$sth = $dbh->prepare("SELECT * FROM `order`", array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
$sth->execute();
生成器
生成器,迭代数据操作
本生成器可省略
尝试代码
class Test {
    public function test()
    {
        set_time_limit(0);
        $dbms="mysql";     //数据库类型
        $host=C("DB_HOST"); //数据库主机名
        $dbName=C("DB_NAME");    //使用的数据库
        $user=C("DB_USER");      //数据库连接用户名
        $pass=C("DB_PWD");          //对应的密码
        $dsn="$dbms:host=$host;dbname=$dbName";
        $dbh = new PDO($dsn, $user, $pass);
        $dbh->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
        $sth = $dbh->prepare("SELECT * FROM `order`");
        $sth->execute();
        $i = 0;

        $newLine = PHP_SAPI == "cli" ? "
" : "
"; foreach ($this->cursor($sth) as $row) { // var_dump($row); echo $row["id"] . $newLine; $i++; } echo "消耗内存:" . (memory_get_usage() / 1024 / 1024) . "M" . $newLine; echo "处理数据行数:" . $i . $newLine; echo "success"; } public function cursor($sth) { while($row = $sth->fetch(PDO::FETCH_ASSOC)) { yield $row; } } } $test = new Test(); $test->test();
输出
1
... //省略部分id
804288
消耗内存:"0.34918212890625M
处理数据行数:254062
success

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28386.html

相关文章

  • PHP+MySQL导出大量数据(Iterator yield)

    摘要:开发中经常遇到这样的场景产品汪我要在后台做一个功能,可以导出自定义时间范围的订单信息。结果,第二天一上班产品汪过来就是拍桌子,我想把去年一整年的订单都导出来,结果后台直接就挂了开发小哥一查,原来是内存溢出了,一年下来的的订单量足足有条。 开发中经常遇到这样的场景 产品汪:我要在后台做一个功能,可以导出自定义时间范围的订单信息。开发小哥二话不说,半天就把功能做完并上线了。结果,第二天一上...

    codergarden 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<