PHP查询大量数据内存耗尽问题的解决方法
来源:才华咖 本文已影响1.42W人
来源:才华咖 本文已影响1.42W人
文章主要为大家详细介绍了PHP查询大量数据内存耗尽问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
从数据库查询大量数据时会出现内容不够的提示:
PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted
这个问题在PHP的网站上叫缓冲查询和非缓冲查询(Buffered and Unbuffered queries)。PHP的查询缺省模式是缓冲模式。也就是说,查询数据结果会一次全部提取到内存里供PHP程序处理。这样给了PHP程序额外的功能,比如说,计算行数,将指针指向某一行等。更重要的是程序可以对数据集反复进行二次查询和过滤等操作。但这种缓冲查询模式的缺陷就是消耗内存,也就是用空间换速度。
相对的`,另外一种PHP查询模式是非缓冲查询,数据库服务器会一条一条的返回数据,而不是一次全部返回,这样的结果就是PHP程序消耗较少的内存,但却增加了数据库服务器的压力,因为数据库会一直等待PHP来取数据,一直到数据全部取完。
很显然,缓冲查询模式适用于小数据量查询,而非缓冲查询适应于大数据量查询。
对于PHP的缓冲模式查询大家都知道,下面列举的例子是如何执行非缓冲查询API。
非缓冲查询方法一: mysqli
?
1
2
3
4
5
6
7
8
9
10
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$uresult = $mysqli->query("SELECT Name FROM City", MYSQLI_USE_RESULT);
if ($uresult) {
while ($row = $uresult->fetch_assoc()) {
echo $row['Name'] . PHP_EOL;
}
}
$uresult->close();
?>
非缓冲查询方法二: pdo_mysql
?
1
2
3
4
5
6
7
8
9
10
<?php
$pdo = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_pass');
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$uresult = $pdo->query("SELECT Name FROM City");
if ($uresult) {
while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) {
echo $row['Name'] . PHP_EOL;
}
}
?>
非缓冲查询方法三: mysql
?
1
2
3
4
5
6
7
8
9
10
<?php
$conn = mysql_connect("localhost", "my_user", "my_pass");
$db = mysql_select_db("world");
$uresult = mysql_unbuffered_query("SELECT Name FROM City");
if ($uresult) {
while ($row = mysql_fetch_assoc($uresult)) {
echo $row['Name'] . PHP_EOL;
}
}
?>
毕竟编程这么多年,我隐约记得PHP里提供有非一次全部加载数据的API,是像处理流媒体那样,随用随取随丢、数据并不会积累在内存的查询方法。经过简单的搜索,果然在网站上找到的正确的用法。
这个问题在PHP的网站上叫缓冲查询和非缓冲查询(Buffered and Unbuffered queries)。 PHP的查询缺省模式是缓冲模式。也就是说,查询数据结果会一次全部提取到内存里供PHP程序处理。这样给了PHP程序额外的功能,比如说,计算行数,将 指针指向某一行等。更重要的是程序可以对数据集反复进行二次查询和过滤等操作。但这种缓冲查询模式的缺陷就是消耗内存,也就是用空间换速度。
相对的,另外一种PHP查询模式是非缓冲查询,数据库服务器会一条一条的返回数据,而不是一次全部返回,这样的结果就是PHP程序消耗较少的内存,但却增加了数据库服务器的压力,因为数据库会一直等待PHP来取数据,一直到数据全部取完。
PHP浮点型的数据的解决方法
内存耗尽导致系统缓慢的解决方法
PHP大批量插入数据库的3种方法
PHP 中 MySQL 数据库异步查询实现
php处理json时中文问题的解决方法
php基础之连接mysql数据库和查询数据
关于php操作mysql执行数据库查询
php各种应用乱码问题的解决方法
PHP如何执行MySql语句查询获得表内所有数据
phpmyadmin导入导出数据库文件最大限制的解决方法
解决PHPutf-8编码问题的方法
PHP大批量插入数据库的方法
简述php 各种应用乱码问题的解决方法
使用php加apc实现上传进度条且在IE7下不显示的问题解决方法
PHP浮点型的数据的解决方法介绍
PHP5中使用PDO连接数据库的方法
农村养老存在的问题及解决对策
电脑内存常见问题分析及解决方法
实现PHP获取表单数据与HTML嵌入PHP脚本的技巧
PHP实现搜索查询功能的方法技巧
数据库设计和访问数据库的 PHP 代码中出现的五个常见问题
如何解决PHP无法实现多线程的问题
php中curlpost 时出现的问题解决
PHP获取远程文件大小的解决方法
PHP数据过滤函数的方法
PHP程序员解决问题8大级别的能力
Photoshop CS6 GPU 常见问题解决方案
关于PHP数组内存耗用太多问题的解决方法
PHP数据库备份脚本的方法
PHP数据库连接的方法
php备份数据库类的方法
PHP基于CURL进行POST数据上传的方法
PHP获取远程文件大小的3种解决方法
PHP中在数据库中保存Checkbox数据
PHP插入数据库的方法
PHP基于CURL进行POST数据上传实例方法
劳动关系存在的问题和解决方法
PPT使用遇到的问题及解决方法
php如何解决中文乱码问题大纲
备份php数据库脚本的方法