Использование памяти при запросе пользователей
У меня небольшая проблема с одним из запросов. Я не могу увеличить лимит памяти в WordPress, так как HostGator устанавливает его на 64MB. Не уверен, возможно ли уменьшить использование памяти, внеся изменения в код. Вот код, который я использую для запроса пользователей с определенной ролью и отображения их имени, профиля и аватара:
<?php $users = get_users('role=s2member_level3'); ?>
<?php foreach ($users as $user) {
$avatar = get_avatar($user->ID, '96');
if (get_the_author_meta('description', $user->ID) == "" && stristr($avatar,"gravatar.com/avatar")) { continue; }
?>
<div class="colaborador">
<div class="imagem-colaborador">
<?php if ($avatar == "") {
echo '<img src="http://1.gravatar.com/avatar/ad516503a11cd5ca435acc9bb6523536?s=96" alt="Аватар пользователя" title="Аватар по умолчанию" />';
} else {
echo $avatar;
} ?>
</div>
<div class="texto-colaborador">
<h2 class="nome-colaborador"><?php echo $user->display_name; ?></h2>
<p><?php the_author_meta('description', $user->ID); ?></p>
</div>
</div>
<?php } ?>

В вашем примере вы получаете все поля в вызове get_users, но на самом деле используете только поля ID и display_name. Таким образом, вы можете сэкономить память, заставив get_users получать только необходимые вам поля.
$users = get_users(array(
'role'=>'s2member_level3',
'fields'=>array('ID', 'display_name'),
));
Это поможет уменьшить использование памяти.

Ты также можешь сэкономить немного памяти, получая поле user_email и передавая его напрямую в функцию get_avatar вместо ID пользователя.

Более того, твоя проверка на пустоту $avatar бесполезна, поскольку get_avatar всегда возвращает валидный URL аватара. Так что твой вызов stristr также бессмыслен и просто тратит память без причины.

Привет, Отто, только что разобрался и убрал эту строку хехе, но проблема с памятью осталась. Я также пробовал использовать пагинацию, но без успеха. Я думаю о том, чтобы изменить адрес аватарки по умолчанию, чтобы загружалось изображение с моего локального хоста. Как думаешь, это что-то изменит?

Получение данных автора
Вы можете заменить множественные вызовы get_the_author_meta()
на один вызов $author_data = get_userdata( $user_id );
. Затем просто извлекайте все необходимое из объекта, например $author_data->ID;
. Это должно сэкономить вам немного памяти.
Аватар
Если вы уберете аватар, это также сэкономит много памяти. Аватары долго загружаются и используют значительный объем памяти.

Что насчет функций, связанных с аватарами, которые используют много памяти сервера?..

Я только вчера посмотрел, как аватар использует память (через панель разработчика Chrome). Я не совсем понимаю почему, но похоже, что в этом есть какая-то проблема.

На самом деле аватар — это главное на этой странице, к сожалению. Но я попробую твой совет, Kaiser, не совсем уверен, что это сработает, но давай попробуем. Спасибо!

Я не понимаю. Как Chrome показывает использование памяти PHP? По быстрому тесту вызов get_avatar()
увеличивает использование памяти на 88 байт.

Как вы тестировали? Я совсем новичок в инструментах разработчика Chrome и не могу повторить то, что пробовал вчера. Без понятия, как я нашел это...

@Vito Argos: Итак mem_usage = ~88 байт x XY пользователей
. Сколько у вас пользователей?

Аватары не используют реальную память на сервере. Это только в браузере. Не беспокойтесь об этом.

Kaiser, у меня 61 пользователь, но я отображаю только тех, у кого есть аватарки в профилях (16), со временем это число будет увеличиваться.
@Otto, так что же может занимать основную часть памяти? Кстати, когда я убираю аватарки, страница загружается идеально, все пользователи отображаются.

Когда я деактивирую свой плагин рассылки, на странице списка пользователей отображается это сообщение: Фатальная ошибка: Недостаточно памяти (выделено 68943872) (попытка выделить 16000 байт) в /home/organo/public_html/wp-includes/media.php на строке 254
