我有以下非常简单的测试PHP代码,它提取数据并将其放入JSON格式的文本中。
我收到以下错误..
致命错误:第33行/var/www/test.php中允许的内存大小为33554432字节(试图分配1979603字节)
第33行是json_encode()
行。
有没有办法让这更有效率? PHP.ini
已设置为最大32M,因此从8M标准开始调整大小!
<?php
require('../../admin/db_login.php');
$db=mysql_connect($host, $username, $password) or die('Could not connect');
mysql_select_db($db_name, $db) or die('');
$result = mysql_query("SELECT * from listinfo") or die('Could not query');
$json = array();
if(mysql_num_rows($result)){
$row=mysql_fetch_assoc($result);
while($row=mysql_fetch_row($result)){
// cast results to specific data types
$test_data[]=$row;
}
$json['testData']=$test_data;
}
mysql_close($db);
echo json_encode($json);
?>
答案 0 :(得分:18)
您可能正在编码一个非常大的数据集。您可以一次编码每一行,而不是在一次大操作中对其进行编码。
<?php
require('../../admin/db_login.php');
$db=mysql_connect($host, $username, $password) or die('Could not connect');
mysql_select_db($db_name, $db) or die('');
$result = mysql_query("SELECT * from listinfo") or die('Could not query');
if(mysql_num_rows($result)){
echo '{"testData":[';
$first = true;
$row=mysql_fetch_assoc($result);
while($row=mysql_fetch_row($result)){
// cast results to specific data types
if($first) {
$first = false;
} else {
echo ',';
}
echo json_encode($row);
}
echo ']}';
} else {
echo '[]';
}
mysql_close($db);
这样,每次调用json_encode()
只会编码一个小数组而不是一个大数组。最终结果是一样的。 这是IMO解决方案,它将使用更少的内存。
答案 1 :(得分:10)
停止复制您的数据数组
$json = array();
if(mysql_num_rows($result)){
$row=mysql_fetch_assoc($result);
while($row=mysql_fetch_row($result)){
// cast results to specific data types
$json['testData'][]=$row;
}
}
有助于减少内存使用量
答案 2 :(得分:7)
使用此内容:
$result = mysql_query("SELECT * FROM listinfo");
$json = array();
$total_records = mysql_num_rows($result);
if($total_records > 0){
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)){
$json[] = $row;
}
}
echo json_encode($json);
答案 3 :(得分:0)
作为首次解决方案,将其设置为256M甚至512M。
MySQL回归给你的数据集很可能很大。因此,即使您的PHP内存效率很高,您仍然会收到OoM错误。因此,作为一个更可行的长期解决方案,请使用LIMIT
语句(SELECT * FROM $table WHERE 1=1 LIMIT 0,30
(从索引0开始,获取30项)。
LIMIT
你的查询仍然是一个好主意: - )
答案 4 :(得分:0)
这是我的第一个完美运作的json
<?php
// connect to mysql server
mysql_connect($host, $username, $password) or die('Could not connect');
// select the db name
mysql_select_db($dbname);
// enter your sql query
$sql = "Select * from Order_Details";
// Creates temp array variable
$temp = array();
// Gets table details
$result = mysql_query($sql);
// Adds each records/row to $temp
while($row=mysql_fetch_row($result)) {
$temp[] = $row;
}
// Formats json from temp and shows/print on page
echo json_encode($temp);
?>