PHP yield大文件读取 与 数据库大数据量读取

2 篇文章 0 订阅

PHP yield大文件读取 与 数据库大数据量读取

yield php5.6版本才有的函数,作用是 实现 生成器,作用的在读取文件的时候,可以一行一行的读取
简单的说可以理解为 php版本的非缓冲查询,意思即是 把数据一行行 读取到php运行内存,并非一次性读取到php运行内存,众所周知,php有很多内置函数,可以帮助我们对数据进行加工操作,因为数据都在内存里面,所以能操作,但是php的运行内存是有极限,默认128M。这里不描述 对文件的读取。

数据库结构:
在这里插入图片描述

php链接mysql版本的 yield 实现方式--------非缓冲查询,如图:

在这里插入图片描述

注意:因为非缓冲查询是 会长时间连接数据库的,有可能会造成慢查询、锁表之类的情况,比较耗mysql资源

相对非缓冲查询就是 缓冲查询:
如果用缓存查询,php内存就会直接爆了,出现内存不足的情况
在这里插入图片描述

以下附上php 实现 yield 链接 mysql 几种方法:
1)

<?php
$link = mysqli_connect('localhost','root','','advertising');
if( $result1 = mysqli_query($link, 'SELECT * FROM `test`',MYSQLI_USE_RESULT) )
{
    $result = $result1;
//    unset($result1);
//    mysqli_close($link); //如果这里切断 mysql 链接 将无法获取 数据,原因是加了MYSQLI_USE_RESULT
    while ( $res = mysqli_fetch_assoc($result1) ){
        echo $res['a'] . PHP_EOL;
        $i++;
        if( $i ==1000  ){
            exit;
        }
    }
}
?>
<?php
$pdo = new \PDO('mysql:host=localhost;dbname=advertising','root','');
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$res = $pdo->query("SELECT * FROM `test`");
//unset($pdo);
$i = 0;
if ($res) {
    while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
        echo $row['a'] . PHP_EOL;
        $i++;
        if( $i ==1000  ){
            exit;
        }
    }
}
?>
<?php
$mysqli  = new mysqli("localhost", "root", "", "advertising");
$uresult = $mysqli->query("SELECT * FROM `test`", MYSQLI_USE_RESULT);
//$uresult->close();
if ($uresult) {
    while ($row = $uresult->fetch()) {
        echo $row['a'] . PHP_EOL;
        $i++;
        if( $i ==1000  ){
            exit;
        }
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值