PHP中大量数据周期中内存消耗的解决方案

PHP中大量数据周期中内存消耗的解决方案
最近开发PHP程序遇到了以下问题:

PHP致命错误:允许内存大小为268435456字节耗尽

错误信息显示的最大内存量允许已用尽。遇到这个错误首先让我很惊讶,但现在觉得,是不奇怪的,因为这个程序我发展是在数据表的搜索特点4万记录foreach语句中使用,也就是说,一次4万数据出来,然后逐一检查数据的每一天。可以想象的是,所有4万个数据加载到内存,而内存不爆炸。
毕竟,经过这么多年的编程,我依稀记得PHP提供了一次加载所有数据的API。它是一种处理流媒体的查询方法,数据不存储在内存中,经过简单的搜索,在官方网站上找到了正确的用法。

这个问题被称为缓冲区查询、缓冲和无缓冲的查询PHP官方网站。PHP的查询的默认模式是一个缓冲区模式。也就是说,查询的数据结果都会在记忆提取PHP程序处理。这给PHP程序的附加功能,如计算行数,指向指针线,等等。更重要的是,该程序可以反复执行两个查询和过滤操作的数据集,但这个缓冲区查询方式的缺点是占用内存空间,即速度变化。

与此相反,另一种PHP查询是非缓冲查询,数据库服务器将返回到数据,而不是完整的返回,结果是PHP程序消耗更少的内存,但增加了服务器数据库的压力,因为数据库将等待PHP获取数据,直到所有数据完成。

显然,缓冲查询模式适用于少量的数据查询,而非缓冲查询适合于大数据查询。

如您所知,对于PHP的缓冲模式查询,下面的示例是如何执行非缓冲查询API。

无缓冲的查询方法1:mysqli
< PHP
$ mysqli =新的mysqli(localhost
uresult美元=美元mysqli ->查询(选择名字的城市
如果($ uresult){
而($行= uresult美元-> fetch_assoc()){
echo $行{ 'name' }。php_eol;
}
}
uresult美元->关闭();
>
无缓冲的查询方法二:pdo_mysql
< PHP
为PDO =新PDO(MySQL:主机= localhost;北京世界
为PDO -> setAttribute(PDO::mysql_attr_use_buffered_query,假);

uresult美元=美元PDO ->查询(选择城市);
如果($ uresult){
而($行= uresult美元->取(PDO::fetch_assoc)){
echo $行{ 'name' }。php_eol;
}
}
>
非缓冲查询方法三:MySQL
< PHP
$ conn = mysql_connect(localhost
$ db = mysql_select_db(世界);

uresult美元= mysql_unbuffered_query(选择城市);
如果($ uresult){
而($行= mysql_fetch_assoc($ uresult)){
echo $行{ 'name' }。php_eol;
}
}
>
以上是解决PHP中大量数据循环内存耗尽的一种方法。我希望能帮助你。

tag:周期数据内存解决方案消耗

相关内容