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