Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
减少大型数据库调用php的内存使用_Php_Wordpress - Fatal编程技术网

减少大型数据库调用php的内存使用

减少大型数据库调用php的内存使用,php,wordpress,Php,Wordpress,我使用这个脚本来交叉引用数据,以便从数据库中检索正确的数据,该数据库需要3个检查,其中2个在for循环中运行 $state=str\u replace(“,”,$state); $state=str_replace(“,”,$state); $getStateGroups=$wpdb->get_results(“从wp_gmw_位置选择*,其中区域代码=“$state”); $groupIdList=array(); 对于($i=0;$iobject\u id); } $groupMemberL

我使用这个脚本来交叉引用数据,以便从数据库中检索正确的数据,该数据库需要3个检查,其中2个在for循环中运行

$state=str\u replace(“,”,$state);
$state=str_replace(“,”,$state);
$getStateGroups=$wpdb->get_results(“从wp_gmw_位置选择*,其中区域代码=“$state”);
$groupIdList=array();
对于($i=0;$iobject\u id);
}
$groupMemberList=array();
对于($i=0;$iget_results(“从wp_bp_groups_成员中选择*,其中group_id=“.$groupIdList[$i]);
对于($x=0;$x用户id);
}
}
$whereList=内爆(“,”,$groupMemberList);
$userGameData=$wpdb->get_results(“从用户_game_数据中选择*,其中uid在($whereList)中,按生命周期的顺序排列\u keys\u dusped DESC”);
返回内爆(“,”,$groupIdList);
使用这个我的内存不足

我已经尝试将内存限制从256M增加到3GB,但它仍然没有内存

我正在使用wordpress,因此,
$wpdb
是wordpress用来与数据库交互的类

我需要交叉引用拉取的数据,以获得我们想要的功能所需的信息。是否有任何方法可以减少这正试图使用的内存,或者在我缺少的代码中是否存在一些bug

编辑: 脚本在
array\u push($groupMemberList,$ggm[$x]->user\u id)行内存不足

如果您只需要ID,为什么要选择所有内容?(更不用说仅仅在其中解释$state会使您容易遭受SQL注入攻击,请仔细阅读准备好的语句。)

您的第一个改进是仅选择id:

SELECT object_id FROM wp_gmw_locations WHERE region_code='$state'
下一件事:您只将ID用于进一步的查询,否则您不会在代码中使用它们,对吗?
那么,为什么不让数据库来完成繁重的工作呢?它在这方面做得更好:

SELECT * FROM wp_bp_groups_members WHERE group_id IN
  (SELECT object_id FROM wp_gmw_locations WHERE region_code='$state')
这不仅消除了所有的内存开销,而且还将对数据库的
n+1
查询变成了一个查询

再说一遍,你只需要身份证?进一步完善您的选择然后

SELECT user_id FROM wp_bp_groups_members WHERE group_id IN
  (SELECT object_id FROM wp_gmw_locations WHERE region_code='$state')
这将大大减少内存占用和执行时间。您应该能够从这里开始,改进代码的其余部分。我建议您旋转一个SQL控制台,只需玩一玩,就可以感受到数据库可以为您做些什么——这是非常多的!在过去的几年中,我没有遇到过任何数据检索任务,我无法用一个查询来解决


顺便说一句:看看-loops,与for循环相比,它们使代码变得非常优雅。

当您声明
$userGameData
和下一步返回
$groupIdList
时,我感到困惑。我想你可以做一个查询,为你做所有这些you@kuh-chan出于测试目的,确保正确填充了
$groupIdList
。请尝试此查询:(它不完美且未经测试)
从用户游戏数据中选择*(从组id所在的wp_bp_groups_成员中选择用户id(从区域代码为“$state”的wp_gmw_位置中选择对象id))按生命周期\u键\u花费描述订购
SELECT user_id FROM wp_bp_groups_members WHERE group_id IN
  (SELECT object_id FROM wp_gmw_locations WHERE region_code='$state')