JSON响应对PHP来说太大了?

时间:2015-05-27 16:44:08

标签: php mysql json

使用我创建的数据库,我可以运行以JSON格式输出数据的搜索查询,然后将它们发送回我的网页。很标准。

$searchQuery  = "SELECT * FROM alldata where $searchBy like '%$searchValue%'" ;
$searchResult = mysqli_query($con, $searchQuery);

while ($row = mysqli_fetch_row($searchResult)) {

$item = array();
    $item["dateReceived"] = convertDate($row[1]);    
    $item["quoteCost"] = $row[15];
    $item["quoteNumber"] = $row[16];
    $item["quoteExpDate"] = convertDate($row[17]);    
    $item["comments"] = $row[21];    

    $output[] = $item; 
    }

$out = array('aaData' => $output);    
echo json_encode($out);

当我的查询过于笼统时,某些内容会失败,我不知道它在哪里。

我从服务器获得的响应是​​:

Fatal error :  Allowed memory size of 134217728 bytes exhausted (tried to allocate 14680165 bytes) in C:\xampp\htdocs\....php</b> on line <b>74</b><br />

我的内存限制在php.ini中设置为:

memory_limit=128M

如果我进入mySQL并编写SELECT * FROM alldata WHERE name like "%a%";,我会得到大约35,000行,每行约有20列,但它只需要一瞬间。

我可以查询该表的数量非常小 - 我该怎么做才能解决这个问题,以便我的用户可以运行更多通用查询?

4 个答案:

答案 0 :(得分:2)

  1. 定义输出数组长度upfront =&gt; $输出=阵列(mysql_count($查询));
  2. 在SQL查询中包含LIMIT

答案 1 :(得分:1)

您可以尝试通过设置

来增加内存
memory_limit=256M

或者如果您只将它用于该查询,您也可以进行临时更改

<?php
    ini_set('memory_limit', '256M');

当然用您需要的适当数量替换'256M'。 但请务必将其重新设置为之前的状态。您不希望PHP耗尽太多内存。

我还建议96Levels给出答案。使用分页来更有效地管理内存。但是,如果您真的想一次处理所有数据,则需要增加内存大小。

答案 2 :(得分:1)

用户无法在一个页面中同时查看所有35,000行。

这会:

(1)增加脚本的执行时间。

(2)可能会崩溃浏览器试图显示如此多的数据。

为了有效执行脚本,请使用分页和/或限制查询。

答案 3 :(得分:1)

你应该做的第一件事是在你的php.ini中增加php的memory_limit(搜索memory_limit = 128M并将其设置为更高的值。不要将值设置为TOO high或者如果脚本的使用效率不高,一些请求将导致使用服务器的所有内存。或者,如果未禁用ini_set函数,则可以使用ini_set('memory_limit', '256M');动态提高限制(通常托管提供程序禁用所以资源不被滥用)。

在PHP中增加内存限制只会暂时解决您的问题,如果您的数据库正在增长。

您使用查询的方式是糟糕的架构。绝不应该在没有LIMIT的情况下执行查询,尤其是对于大型数据集。

除了提高已经很低的memory_limit之外,还有一些事情你需要注意。您当前遇到的问题(如果自己执行的查询确实快速返回响应)只是为结果数组/对象及其转换后的字符串分配足够的空间在内存中;然而,其他问题可能会在现在或将来引起这种情况。我可以在这里找出一些帮助你一劳永逸地解决这个问题。

1-在您的请求中添加限制和页面参数,以便您可以对结果进行分页。

2-在MySQL中使用正确的索引来查找您要搜索的字段。如果您正在搜索varchar或文本字段,则最好使用全文索引而不是常规B树索引。 Full-Text Search Functions

3-如果由于某种原因你不能使用全文搜索(例如:你必须使用InnoDB而不是MyISAM),请确保你不使用通配符&#39;%&#39;在字符串的开头,因为它不会正确使用索引(如果使用常规B树索引而不是全文)。

如果您绝对必须使用它,我建议转到全文搜索(如果您想坚持使用MySQL进行搜索而不使用Apache SolrSphinx Search或{{等搜索引擎3}}仅举几例。