我有一个php文件,它将从mysql_query()检索到的结果编码为json格式。我收到的数据很大,即接近200,000个元组,每个元组有近10个变量。早些时候,我得到了一个例外,“允许的内存大小为67108864字节耗尽”。然后我在互联网上搜索,有人引用了mysql_unbuffered_query是解决方案。我也试过了,但我又得到了同样的错误。我们如何在php中处理如此大的数据?
增加内存也不是一个选项,因为我有一个共享 托管帐户。
这是我用于检索结果和编码为json的代码。
$result=mysql_unbuffered_query("Some query which gives large data");
$res=array();
if($result)
{
while($r = mysql_fetch_assoc($result))
{
$rows[] = $r;
}
print json_encode($rows);
}
else
{
echo mysql_error();
}
这些问题的解决办法是什么?
答案 0 :(得分:2)
这样的事情就像我想象的那样,只需添加你的疑问等等。
// Must be zero to get 1st record
$limit = 0;
// Determine how many you want to pull at a time
$offset = 10;
// Run count query to get this value
$total = 10000; // <- number of records needing to be pulled
for ($limit; $limit <= $total; $limit + $offset) {
// Run query here and pump results into an array
echo "Total: ".$total."<br>";
echo "offset: ".$offset."<br>";
echo "limit: ".$limit."<br>";
}
警告:确保您的总计数可以被偏移量整除,否则您将丢失记录,例如:
$offset = 19;
$total = 10000;
将最后一次通话输出为:
总计:10000
抵消:19
限制:9994
修改强>
尝试使用以下模板,看看是否有帮助,当我运行我在json_encode
循环中使用$limit + $offset
和for
的原始答案时,我得到了相同的内存错误,但是这个下一点对我有用。
$offset = 10;
$total = 1000000;
$array = array();
for ($limit = 0; $limit <= $total; $limit++) {
// Your code here
$array[$limit] = $offset;
// Keep the following line
$limit = ($limit - 1) + $offset;
}
print json_encode($array);