带有SQL结果的PHP内存限制

带有SQL结果的PHP内存限制,php,sql,Php,Sql,我面临着一个根本不难解决的问题,但不知何故我不能。下面是一个场景: 我想把SQL语句的结果提取到PHP数组中,看起来很简单,对吗 问题是它给了我关于内存限制的错误(致命错误:内存不足(已分配408944640)(试图分配805306376字节)) 下面是我的代码,它使用的语句给出的结果较少(我需要使用的语句包含+/-4000条记录) 不太清楚它为什么使用0.8GB内存(对于一个简单的语句来说似乎很简单。不过,为了尝试一下,我已经将php.ini文件中的内存限制更改为:内存限制=8192M。但它根

我面临着一个根本不难解决的问题,但不知何故我不能。下面是一个场景:

我想把SQL语句的结果提取到PHP数组中,看起来很简单,对吗

问题是它给了我关于内存限制的错误(致命错误:内存不足(已分配408944640)(试图分配805306376字节)

下面是我的代码,它使用的语句给出的结果较少(我需要使用的语句包含+/-4000条记录)

不太清楚它为什么使用0.8GB内存(对于一个简单的语句来说似乎很简单。不过,为了尝试一下,我已经将php.ini文件中的内存限制更改为:内存限制=8192M。但它根本没有帮助(检查了调用php\u info()函数是否应用了内存限制)


谢谢大家!

为什么不使用Wordpress进行如下查询和分页:

$args = array(
    "post_type" => "shop_order",
    "posts_per_page" => 1000,
    "post_status" => array("any"),
    "paged" => $paged, // pass your pagination here from javascript
    "meta_query" => array(
        "key" => "_order_total",
        "compare" => "EXISTS"
    )
);
$custom_posts = get_posts($args);

echo json_encode($custom_posts);

不要在内存中保存完整的结果表,否则您的服务器很容易受到DOS攻击。服务器必须能够同时响应多个请求。一次只处理一行,然后释放分配的内存

您应该直接输出逗号分隔的JSON块

echo '[';

$sep = '';
while(($row = mysqli_fetch_assoc($sql_query))!== false){
    echo $sep . json_encode($row);
    $sep = ',';
}

echo ']';
或者,您可以将其缓存在临时文件中

在较新的MySql版本上,您可以尝试:

SELECT JSON_OBJECT('meta_value', meta_value, 'post_date', post_date)
FROM wp_postmeta 
INNER JOIN wp_posts ON wp_posts.ID=wp_postmeta.post_id 
WHERE wp_posts.post_type ='shop_order' 
AND wp_postmeta.meta_key = '_order_total' 
INTO OUTFILE '/tmp/mysql-temp-GENERATED_UUID';
这将生成一个包含JSON行的文件,但不是逗号分隔的。 正如aggretage函数
JSON_ARRAYAGG
中的文档所述,应该可以解决这个问题。(不幸的是,我的安装与第三方存储库冲突,因此我无法测试它。)

如果
JSON_ARRAYAGG
由于某种原因导致问题,解决方法(至少在类unix系统上)是:

<?php
  $guid = bin2hex(openssl_random_pseudo_bytes(16));
  $tmp_filename = "/tmp/mysql-json-{$guid}.json";
  /* let MySql generate the tempfile, then */

  passthru('sed \'1 s/^/[/; $! s/$/,/ ; $ s/$/]/\' ' . $tmp_filename);
?>


它不是语句,而是存储在数组中的表中的数据
$result[]
你真的需要一个
内部连接吗?你的mysqli_fetch_assoc已经是一个数组了。那么为什么不回显它并跳过while循环呢?你真的需要同时使用这4000行吗?你真正想达到的目的是什么?这可能是一个问题,用户需要结果来创建图表。分页结果不是他想要的eds.我只需要一个简单的应用程序来分析数据并在图表上显示em,所以我认为使用wordpress是没有意义的。当然,他是OOM。分页将允许他在不耗尽内存的情况下分块执行查询。然后我将使用ajax或API进行查询并填充图表。这将允许您处理无限e大量记录而不耗尽内存。@TimHallman这可能是个好主意,我可能会尝试一下,但必须阅读更多关于AJAX和API解决方案的信息。结果是
[{},{}{}]
是,已编辑。应该在动态编码之前睡眠。:)否,
$sep
是第一次迭代后设置的前缀。它显示了结果,但是,加载所有结果的速度很慢。在将数据保存到数组中时,考虑情况是否不同。也许有更好的方法将这么多记录传递给JavaScript。你们有什么想法吗?@Sinner取决于你们的MySql版本
选择JSON_数组(…)
/
选择JSON_对象(…)
到OUTFILE'/tmp/[some random uid].JSON'
/完成后不要忘记删除临时文件。
SELECT JSON_ARRAGG(JSON_OBJECT('meta_value', meta_value, 'post_date', post_date))
FROM wp_postmeta 
INNER JOIN wp_posts ON wp_posts.ID=wp_postmeta.post_id 
WHERE wp_posts.post_type ='shop_order' 
AND wp_postmeta.meta_key = '_order_total' 
INTO OUTFILE '/tmp/mysql-temp-GENERATED_UUID';
<?php
  $guid = bin2hex(openssl_random_pseudo_bytes(16));
  $tmp_filename = "/tmp/mysql-json-{$guid}.json";
  /* let MySql generate the tempfile, then */

  passthru('sed \'1 s/^/[/; $! s/$/,/ ; $ s/$/]/\' ' . $tmp_filename);
?>