PHP yield大文件读取 与 数据库大数据量读取
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;
}
}
}