Использование памяти при запросе пользователей

29 авг. 2011 г., 23:43:40
Просмотры: 685
Голосов: 2

У меня небольшая проблема с одним из запросов. Я не могу увеличить лимит памяти в 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 } ?>
1
Комментарии

Не то чтобы я сторонник прямого доступа к базе данных, но если вы столкнулись с экстремальными ситуациями нехватки памяти, может ли это быть для вас решением? get_users() кэширует каждого "полученного" пользователя в оперативной памяти; если у вас огромное количество пользователей, это съест тонну памяти. Вы можете обойти это, используя прямой запрос к базе данных.

Tom Auger Tom Auger
30 авг. 2011 г. 22:22:17
Все ответы на вопрос 2
5

В вашем примере вы получаете все поля в вызове get_users, но на самом деле используете только поля ID и display_name. Таким образом, вы можете сэкономить память, заставив get_users получать только необходимые вам поля.

$users = get_users(array(
  'role'=>'s2member_level3', 
  'fields'=>array('ID', 'display_name'),
));

Это поможет уменьшить использование памяти.

30 авг. 2011 г. 01:09:10
Комментарии

Привет Otto, попробовал твой совет, но проблема остаётся :/

Vitor Argos Vitor Argos
30 авг. 2011 г. 01:26:57

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

Otto Otto
30 авг. 2011 г. 15:35:43

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

Otto Otto
30 авг. 2011 г. 15:36:29

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

Vitor Argos Vitor Argos
30 авг. 2011 г. 15:41:32

Кстати, есть ли способ проверить, что именно на этой странице использует память?

Vitor Argos Vitor Argos
30 авг. 2011 г. 15:42:40
11

Получение данных автора

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

Аватар

Если вы уберете аватар, это также сэкономит много памяти. Аватары долго загружаются и используют значительный объем памяти.

29 авг. 2011 г. 23:51:33
Комментарии

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

Rarst Rarst
30 авг. 2011 г. 00:16:49

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

kaiser kaiser
30 авг. 2011 г. 00:19:44

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

Vitor Argos Vitor Argos
30 авг. 2011 г. 00:26:54

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

Rarst Rarst
30 авг. 2011 г. 00:27:37

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

kaiser kaiser
30 авг. 2011 г. 00:35:22

xdebug_memory_usage() до и после (требуется xdebug, очевидно).

Rarst Rarst
30 авг. 2011 г. 00:47:56

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

kaiser kaiser
30 авг. 2011 г. 00:54:34

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

Otto Otto
30 авг. 2011 г. 01:05:08

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

@Otto, так что же может занимать основную часть памяти? Кстати, когда я убираю аватарки, страница загружается идеально, все пользователи отображаются.

Vitor Argos Vitor Argos
30 авг. 2011 г. 01:26:39

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

Vitor Argos Vitor Argos
30 авг. 2011 г. 01:32:27

@Rarst & Otto Спасибо за тестирование, объяснение и уточнение.

kaiser kaiser
30 авг. 2011 г. 19:37:32
Показать остальные 6 комментариев