#php #wordpress
#php #wordpress
Вопрос:
Я использую этот скрипт для перекрестных ссылок на данные, чтобы я мог извлекать правильные данные из базы данных, для чего требуется 3 проверки, из которых 2 выполняются в цикле for
$state = str_replace("<span>","",$state);
$state = str_replace("</span>","",$state);
$getStateGroups = $wpdb->get_results("SELECT * FROM wp_gmw_locations WHERE region_code='$state'");
$groupIdList = array();
for($i = 0; $i < count($getStateGroups); $i ){
array_push($groupIdList,$getStateGroups[$i]->object_id);
}
$groupMemberList = array();
for($i =0; $i < count($groupIdList);$i ){
$ggm = $wpdb->get_results("SELECT * FROM wp_bp_groups_members WHERE group_id=" . $groupIdList[$i]);
for($x = 0; $x < count($ggm); $i ){
array_push($groupMemberList,$ggm[$x]->user_id);
}
}
$whereList = implode(',',$groupMemberList);
$userGameData = $wpdb->get_results("SELECT * FROM user_game_data WHERE uid IN ($whereList) ORDER BY lifetime_keys_spent DESC");
return implode(',',$groupIdList);
используя это, у меня заканчивается память
Я попытался увеличить свой лимит памяти с 256 МБ до 3 ГБ, и он по-прежнему исчерпывает память
Я использую WordPress, поэтому $wpdb
это класс, который wordpress использует для взаимодействия с базой данных
Мне требуется перекрестно ссылаться на извлеченные данные, чтобы получить информацию, необходимую для нужной нам функциональности, есть ли какой-либо способ уменьшить объем памяти, который это пытается использовать, или есть какая-то ошибка в коде, которую я пропускаю?
РЕДАКТИРОВАТЬ: Скрипту не хватает памяти в строке array_push($groupMemberList,$ggm[$x]->user_id);
Комментарии:
1. Я в замешательстве, поскольку вы объявляете
$userGameData
и на следующем шаге возвращаете$groupIdList
. Я думаю, вы могли бы создать один запрос, который сделает все это за вас2. @kuh-chan Это было в целях тестирования, чтобы убедиться, что
$groupIdList
заполняется правильно3. попробуйте этот запрос: (он не идеален и не протестирован)
select * from user_game_data where uid in ( select user_id from wp_bp_groups_members where group_id in ( select object_id from wp_gmw_locations where region_code = '$state' ) ) order by lifetime_keys_spent desc
Ответ №1:
SELECT * FROM wp_gmw_locations WHERE region_code='$state'
если вам нужны только идентификаторы, почему вы выбираете все? (не говоря уже о том, что простая интерпретация $ state там делает вас подверженным атакам SQL-инъекций, прочитайте подготовленные инструкции.)
вашим первым улучшением будет только выбор идентификатора:
SELECT object_id FROM wp_gmw_locations WHERE region_code='$state'
следующее: вы используете идентификаторы только для дальнейших запросов, иначе вы не используете их в своем коде, верно?
тогда почему бы не позволить базе данных выполнять тяжелую работу, у нее это получается намного лучше:
SELECT * FROM wp_bp_groups_members WHERE group_id IN
(SELECT object_id FROM wp_gmw_locations WHERE region_code='$state')
который не только избавляет от всех этих затрат памяти, но и превращает n 1
запросы к базе данных в один.
опять же, вам нужен только идентификатор? затем доработайте свой select!
SELECT user_id FROM wp_bp_groups_members WHERE group_id IN
(SELECT object_id FROM wp_gmw_locations WHERE region_code='$state')
это должно значительно сократить объем вашей памяти и время выполнения. вы должны быть в состоянии извлечь это отсюда и улучшить остальной код. я рекомендую запустить SQL-консоль и просто немного поиграть, чтобы вы почувствовали, что база данных может сделать для вас — это довольно много! за последние несколько лет я не сталкивался ни с одной задачей поиска данных, которую я не мог бы решить с помощью одного запроса.
кстати: взгляните на циклы foreach, они делают код довольно элегантным по сравнению с циклами for.