使用PHP从MySQL抓取190k行,空白页?内存还是缓冲区?

使用PHP从MySQL抓取190k行,空白页?内存还是缓冲区?,php,mysql,Php,Mysql,我试图从表中获取所有数据,以计算一些统计数据 目前有190.000行和计数,我只选择必要的列 使用Kohana Query Builder,当我对MySQL查询执行()->count()(仅对行进行计数)时,它工作正常并返回数字190.000 当我尝试获取数据时,通过执行execute()->as_array(),它会死掉-它显示一个空白页 我试着研究确定它是MySQL数据库限制/缓冲区限制,还是PHP端-我认为是PHP有限制?我错了吗?我可以通过mysql控制台很好地获取我需要的东西 我在自己

我试图从表中获取所有数据,以计算一些统计数据

目前有190.000行和计数,我只选择必要的列

使用Kohana Query Builder,当我对MySQL查询执行()->count()
(仅对行进行计数)
时,它工作正常并返回数字190.000

当我尝试获取数据时,通过执行
execute()->as_array()
,它会死掉-它显示一个空白页

我试着研究确定它是MySQL数据库限制/缓冲区限制,还是PHP端-我认为是PHP有限制?我错了吗?我可以通过mysql控制台很好地获取我需要的东西

我在自己的快速服务器上运行,所以这应该不是问题——但我不知道要配置哪些变量(php设置)

我能做什么

更新:

日志上写着:
PHP致命错误:
允许的内存大小134217728字节已耗尽

PHP已达到内存限制,这对于如此大量的数据是正常的。你必须重新思考你的想法,试着把它分成几个部分,从中计算统计数据,然后加入其中。 要做到这一点,您可以加载1000-5000行,计算您的统计数据,保存到某个变量/数组中,然后加载下一部分

另一种方法是增加内存限制,但这不是个好主意,因为它可能不稳定


也可以尝试直接在数据库中计算统计数据,可能吗?这将是最快的方式,因为数据库已经准备好对其数据进行操作。

把科哈纳放在一边,因为我从未使用过它,您目前正在做的基本上是:

$result = mysql_query(...);
$data   = array();
while ($row = mysql_fetch_assoc($result)) {
    $data[] = $row;
}
也就是说,您将使用
MySQL\u fetch\u assoc
从MySQL获取所有数据,并通过将其推入
$data
将所有数据存储在PHP内存中。这意味着PHP需要有足够的内存来一次存储所有数据,而它没有

您要做的是从MySQL中获取一个结果行,对其执行一些操作,然后转到下一行,而不立即将所有内容存储在内存中:

$result = mysql_query(...);
while ($row = mysql_fetch_assoc($result)) {
    echo $row['foo'];
}
不,请不要使用不推荐使用的mysql_uAPI,它只是这里最大的公分母示例。此外,必须有更好的方法来执行任何您想执行的操作,而不是尝试一次获取并输出190000行。

允许的内存大小134217728字节已耗尽“=>这些是您配置的128 MB。因此,您可以增加服务器配置/php.ini中的内存限制:

如果将此值设置为
-1
,脚本将不再有任何限制,并且可以在操作系统允许的范围内消耗整个可用内存

但是,让RDBMS进行计算(不获取php中的所有内容!)或者在“数据包”中进行计算可能是明智的,例如,按月单独计算统计数据,然后聚合月份统计数据。这将导致一次加载的数据减少

MySQL允许您对数据运行多个聚合函数。例如,您可以让它计算平均值、最小/最大值、所有值之和。。。在这种情况下,您只需选择结果,而不需要将所有数据提取到php脚本的内存中进行分析。仅对于复杂的统计计算,MySQL的聚合函数是不够的


日志中有任何内容吗?日志中没有任何内容,我尝试了错误报告,没有任何内容。我怀疑您达到了PHP的内存限制-尽管我有点惊讶它设置得这么低!?!将整个结果集提取为数组很可能是个问题,这要么是超时,要么是内存耗尽。您应该逐行循环遍历结果集,一次只从MySQL获取一行并输出它,而不试图一次将其全部填充到内存中。另一方面,如果有函数允许您在MySQL端加载190000行到PHP脚本中进行统计推断,为什么要将其加载到PHP脚本中,根据@deceze,仍将消耗内存限制,我也刚刚尝试了您的方法,该方法也表明它仍然消耗太多内存limit@Karem不要存储行!计算统计数据并保存,然后删除已使用的行以释放内存。
$result = mysql_query(...);
while ($row = mysql_fetch_assoc($result)) {
    echo $row['foo'];
}