如何解决PHP使用mysql_query查询超大结果集超内存问题


再使用mysql_query查询超大结果集的时候会出现超出内存限制的致命错误,这是因为mysql_query采用的是查询全部结果然后把结果集全部缓存到内存中的方式。

mysql的查询还提供了另外一种查询方式,函数名为mysql_unbuffered_query,这个函数采用的是查出结果后立即操作结果集,并不会把结果集缓存到内存中,这样就避免了超出内存的情况发生。但是使用这个方法的代价就是不能再查询的时候使用获取总行之类的方法,因为这种方法是便查询边返回结果。同时在使用该方法的时候不能在同一数据库链接上执行其他的操作,想要执行其他操作的时候必须先终止当前操作,释放所有未缓存的sql查询所产生的结果行,或者重新实例化一个数据库连接,使用新链接进行其他操作。

以下是使用缓存和不使用缓存的对比(所查询的表中有1000多万行数据):

function selecttest()
{
try {
$pdo = new PDO("mysql:host=localhost;dbname=test", 'root', '123456');
// 不使用缓存结果集方式
// $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$sth = $pdo->prepare('select * from test');
$sth->execute();
echo '最初占用内存大小:' . memory_get_usage() . "\n";
$i = 0;
while ($result = $sth->fetch(PDO::FETCH_ASSOC)) {
$i += 1;
if ($i > 10) {
break;
}
sleep(1);
print_r($result);
echo '占用内存大小:' . memory_get_usage() . "\n";
}
} catch (Exception $e) {
echo $e->getMessage();
}
}

上面使用到的是缓存所有结果集的方式,运行该函数时将会报超内存的错误,如下所示:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 204800000 bytes) in E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php on line 57

Call Stack:

0.0005 135392 1. {main}() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:0
0.0005 135568 2. test->selecttest() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:86
0.0055 142528 3. PDOStatement->execute() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:57

在执行$sth->execute();时超出内存限制;

将// $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);这行的注释去掉后将使用不缓存结果集的方式,运行该函数将输出以下内容:

最初占用内存大小:144808

Array
(
[id] => 1
[a] => v
[b] => w
[c] => i
)

占用内存大小:145544

Array
(
[id] => 2
[a] => b
[b] => l
[c] => q
)

占用内存大小:145544

Array
(
[id] => 3
[a] => m
[b] => p
[c] => h
)

占用内存大小:145536

Array
(
[id] => 4
[a] => j
[b] => i
[c] => b
)

占用内存大小:145536

Array
(
[id] => 5
[a] => q
[b] => g
[c] => g
)

占用内存大小:145536

可以看到,使用不缓存结果集的方式获取一行结果所占用的内存是极少的。这样就结局了超出内存限制的问题。



相关阅读:
jQuery插件开发的两种方法及$.fn.extend的详解
win10耳机有电流声而且声音很大影响使用该怎么办?
如何解决JQuery ajaxSubmit提交中文乱码
Win10 Mobile Build 10549正式推送:须回滚到WP8.1升级
Asp.net把图片存入数据库和读取图片的方法
js实现iframe框架取值的方法(兼容IE,firefox,chrome等)
jquery使用ul模拟select实现表单美化的方法
PHP获取音频文件的相关信息
Android处理图像数据转换的各种方法
C#特性 扩展方法
php使用百度ping服务代码实例
C语言中用于产生随机数的函数使用方法总结
js将当前时间格式转换成时间搓(自写)
使用GruntJS构建Web程序之Tasks(任务)篇
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 CMS SQL jQuery C# C++ java Android IOS oracle MongoDB PostgreSQL SQLite 交通频道 高桥镇客运站 四川省内江市东兴区
洪雅县城东车站 四川省眉山市洪雅县
乐清大荆客运中心 荆水路
桓仁四河客运站 辽宁省本溪市桓仁满族自治县
澜沧木戛客运站 云南省普洱市澜沧拉祜族自治县
清涧汽车客运站 陕西省榆林市清涧县
安子营乡客运站 河南省南阳市镇平县
昭觉汽车站 解放路14-4
兴仁汽车站 广东省清远市清城区
奉节汽车客运总站 重庆市奉节县
靖宇三道湖客运站 吉林省白山市靖宇县
上墅客运站 浙江省湖州市安吉县
榆树李合客运站 吉林省长春市榆树市
口运快餐店汽车站店 广西壮族自治区玉林市玉州区
新临安汽车东站 石镜街
张家港妙桥客运服务站 人民东路
林城汽车站 浙江省湖州市长兴县
成佳客运站 四川省成都市蒲江县
景东花山客运站 云南省普洱市景东彝族自治县
北京德胜门外长途汽车站 北京市
罗亭客运站 江西省南昌市湾里区
青岛民航客运中山路售票处 山东省青岛市市南区
天门岳口长途汽车客运站 湖北省天门市
景德镇汽车东站 江西省景德镇市珠山区
林西汽车站 内蒙古自治区赤峰市林西县
平武县土城客运站 四川省绵阳市平武县
铅厂客运站 云南省昭通市巧家县
石嘴山市大武口区汽车客运南站 青山南路
铁佛客运站 陕西省安康市汉阴县
宁乡青山桥镇汽车站 湖南省长沙市宁乡县
翼城里砦汽车客运站 山西省临汾市翼城县
中国联通城东汽车站合作营业厅 江西省新余市渝水区
密云公共汽车站 北京市密云县
通海河西汽车客运站 云南省玉溪市通海县
张集矿区客运站 安徽省淮南市凤台县
潢开汽车站 河南省信阳市潢川县
梨园客运站 山东省聊城市冠县
榆社郭郊客运站 山西省晋中市榆社县
拉萨东郊汽车客运站 西藏自治区拉萨市城关区
淄博汽车总站 昌国路与西九路交叉路口以东路南,中国陶瓷科技城对面
社旗县郝寨镇汽车客运站 河南省南阳市社旗县
中国移动汽车站服务厅 新兴北路247号
龙山客运站 山东省青岛市即墨市
嘉善汽车站 环北西路160
树通客运站 广东省揭阳市榕城区
北京市京环出租汽车站 北京 朝阳区 东大桥路10号(100020)
驷马汽车站 四川省巴中市平昌县
峨眉山五显岗车站 四川省乐山市峨眉山市
长乐客运站行包提领处 福建省福州市长乐市
秭归县磨坪乡客运站 湖北省宜昌市秭归县
庄河市汽车站工会委员会 辽宁省大连市庄河市
新澜客运 广东省深圳市宝安区
青岛汽车西站 近郊胶州市郑州西路2号公交/驾车
县底客运站 广西壮族自治区玉林市容县
龙山客运站 吉林省四平市公主岭市
马山县周鹿车站 九一三县道
官桥客运站 山东省枣庄市滕州市
金星客运站 浙江省宁波市象山县
道台桥客运站 黑龙江省哈尔滨市依兰县
麻柳沱汽车站 重庆市
湖坊汽车站 江西省上饶市铅山县
长运汽车站售票处 建兴东路70号
扶风段家客运站 陕西省宝鸡市扶风县
赤水长期镇汽车客运站 贵州省遵义市赤水市
化河乡客运站 河南省周口市商水县
红桥汽车站候车厅 天津市
军山汽车站 江西省九江市永修县
河口乡客运站 八五县道
金城江汽车东站 广西壮族自治区河池市金城江区
黄骅市个体汽车站 二零五国道
献县东汽车站 东环路
湖东汽车站 河南省信阳市浉河区
林甸红旗客运站 黑龙江省大庆市林甸县
凤阳汽车站包车联系处 安徽省滁州市凤阳县
长治市故县汽车站 山西省长治市郊区
兴隆庄煤矿汽车站 山东省济宁市兖州市
西坪汽车站 河南省南阳市西峡县
白马渡镇客运站 湖南省永州市道县
湖滨长途汽车站停车场 福建省厦门市思明区
朝天门长途汽车总站 长江滨江路8
六里桥客运主枢纽停车场 北京市
迁安沙河驿汽车客运站 河北省唐山市迁安市
岳阳联运汽车站 站前路532
公路客运站 黑龙江省齐齐哈尔市克山县
扬州汽车客运站西站B区停车场 江苏省扬州市邗江区
七甲乡农村客运站 零四一县道
鄂州西山客运站 寒溪路
南京长途汽车东站客车出站口 南京花园路17号
蛇形山客运站 湖南省娄底市双峰县
瑞金城西客运站 江西省赣州市瑞金市
客运总站招待所 辽宁省鞍山市岫岩满族自治县
张家港妙桥客运服务站 人民东路
墩头客运站 浙江省舟山市普陀区
桃林镇客运站 河南省信阳市潢川县
高山镇汽车站 河南省洛阳市伊川县
嘉善丁栅镇汽车站 丁栅镇
瓦店镇汽车站 河南省南阳市宛城区
三阳乡车站 三二四省道
镇安汽车站 浙江省温州市乐清市
三里客运站 湖北省孝感市大悟县

Copyright © 2016 phpStudy |