手机版

解决PHP中大量数据循环时内存不足问题的方法

时间:2021-10-01 来源:互联网 编辑:宝哥软件园 浏览:

最近在开发一个PHP程序时,遇到了以下问题:

PHP致命错误:允许的内存大小为268 435 456字节用尽

错误消息显示最大允许内存已用尽。一开始遇到这样的错误我很惊讶,但仔细想想也不奇怪,因为我正在开发的程序是用一个foreach循环语句,在一个有4万条记录的表中搜索特定特征的数据,也就是一次取出4万条数据,然后一条一条的查看每天的数据。可以想象,4万条数据全部加载到内存中,奇怪的是内存不会爆炸。

毕竟编程这么多年,我依稀记得PHP提供了一个API,不会一次加载全部数据。它是一种使用时取数据并抛出数据的查询方法,数据不会积累在内存中,就像处理流媒体一样。简单搜索了一下,在官网找到了正确的用法。

这个问题在PHP官方网站上叫做缓冲和非缓冲查询。PHP默认的查询模式是缓冲模式。也就是说,查询数据的结果将一次提取到内存中,供PHP程序处理。这给了PHP程序额外的功能,比如计算行数和将指针指向某一行。更重要的是,程序可以重复查询和过滤数据集。但是这种缓冲区查询模式的缺陷是消耗内存,也就是用空间换速度。

相反,另一种PHP查询模式是无缓冲查询,数据库服务器会逐个返回数据,而不是一次全部返回。因此,PHP程序消耗的内存更少,但却增加了数据库服务器的压力,因为数据库将一直等待PHP获取数据,直到所有数据都被获取。

显然,缓冲查询模式适合小数据查询,而非缓冲查询适合大数据查询。

我们都知道PHP的缓冲查询,下面的例子是如何执行无缓冲查询API。

无缓冲查询方法-: MySQL。

?PHP $ MySQL=new MySQL(' 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();无缓冲查询方法2 : pdo_mysql。

?php $pdo=新PDO(' MySQL : host=localhost;dbname=world ',' my_user ',' my _ pass ');$ PDO-setAttribute(PDO : myql _ ATTR _ USE _ BUFFERED _ QUERY,false);$ ureresult=$ PDO-query(' SELECT Name FROM City ');if($ uresult){ while($ row=$ uresult-fetch(PDO : fetch _ ASSOC)){ echo $ row[' Name ']。PHP _ EOL} } ?无缓冲查询方法。

?PHP $ conn=MySQL _ connect(' localhost ',' my_user ',' my _ pass ');$ db=MySQL _ select _ db(' world ');$ ureresult=MySQL _ unbuffed _ query(' SELECT Name FROM City ');if($ uresult){ while($ row=MySQL _ fetch _ assoc($ uresult)){ echo $ row[' Name ']。PHP _ EOL} } ?以上内容是边肖与大家分享的解决PHP中循环大量数据时内存不足问题的方法。希望对你有帮助。

版权声明:解决PHP中大量数据循环时内存不足问题的方法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。