Uso de memoria al consultar usuarios

29 ago 2011, 23:43:40
Vistas: 685
Votos: 2

Tengo un pequeño problema con una de mis consultas. No puedo aumentar el límite de memoria de WordPress ya que HostGator lo establece en 64MB. No estoy seguro si es posible reducir la cantidad de memoria usada haciendo algunos cambios en mi código. Aquí está el código que estoy usando para consultar usuarios de un rol específico y mostrar su nombre, perfil y avatar:

<?php $users = get_users('role=s2member_level3'); ?> 
<?php foreach ($users as $user) {
    $avatar = get_avatar($user->ID, '96');
    // Si no hay descripción y el avatar es de Gravatar, continuar con el siguiente usuario
    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="Avatar por defecto" title="Avatar de usuario" />'; 
            } 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
Comentarios

No es que sea partidario del acceso directo a la base de datos, pero si te encuentras en situaciones extremas de memoria, ¿sería esa una solución para ti? get_users() almacenará en caché cada usuario "obtenido" en la RAM; si tienes una cantidad enorme de usuarios, esto consumirá una tonelada de RAM. Podrías evitar esto con una consulta directa a la base de datos.

Tom Auger Tom Auger
30 ago 2011 22:22:17
Todas las respuestas a la pregunta 2
5

En tu ejemplo, estás obteniendo todos los campos en la llamada get_users, pero realmente solo estás usando los campos ID y display_name. Así que puedes ahorrar algo de memoria forzando a get_users a obtener solo los campos que necesitas.

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

Eso ayudará a reducir tu huella de memoria.

30 ago 2011 01:09:10
Comentarios

Hola Otto, probé tu sugerencia pero el problema persiste :/

Vitor Argos Vitor Argos
30 ago 2011 01:26:57

También podrías ahorrar algo de memoria obteniendo el campo user_email y pasándolo directamente a la función get_avatar en lugar del ID de usuario.

Otto Otto
30 ago 2011 15:35:43

Además, tu verificación de que $avatar esté vacío es inútil, ya que get_avatar siempre devolverá una URL de avatar válida. Así que tu llamada a stristr también es innecesaria y consume memoria sin motivo.

Otto Otto
30 ago 2011 15:36:29

Hola Otto, acabo de darme cuenta y eliminé esta línea jeje, pero el problema de memoria sigue ahí. También intenté usar paginación pero sin éxito. Estoy pensando en cambiar la dirección del avatar predeterminado, para que cargue una imagen ubicada en mi localhost, ¿crees que hará alguna diferencia?

Vitor Argos Vitor Argos
30 ago 2011 15:41:32

Por cierto, ¿hay alguna forma de comprobar qué está usando realmente la memoria en esta página?

Vitor Argos Vitor Argos
30 ago 2011 15:42:40
11

Llamar datos del autor

Podrías cambiar tus múltiples llamadas a get_the_author_meta() por una sola llamada $author_data = get_userdata( $user_id );. Luego simplemente extrae todo del objeto como $author_data->ID;. Esto debería ahorrarte algo de memoria.

Avatar

Si omites el avatar también ahorrarás mucha memoria. Los avatares tardan mucho en cargar y consumen una gran cantidad de memoria.

29 ago 2011 23:51:33
Comentarios

¿Qué pasa con las funciones relacionadas con avatares que usan mucha memoria del servidor?..

Rarst Rarst
30 ago 2011 00:16:49

Ayer revisé cómo el avatar usa memoria (a través de la barra de desarrollo de Chrome). Realmente no entiendo por qué, pero parecía que hay algo al respecto.

kaiser kaiser
30 ago 2011 00:19:44

En realidad el avatar es lo principal de esta página, desafortunadamente. Pero probaré tu sugerencia Kaiser, no estoy muy seguro de que funcione, pero intentémoslo. ¡Gracias!

Vitor Argos Vitor Argos
30 ago 2011 00:26:54

No entiendo. ¿Cómo muestra Chrome el uso de memoria de PHP? En una prueba rápida, la llamada a get_avatar() aumenta el uso de memoria en 88 bytes.

Rarst Rarst
30 ago 2011 00:27:37

¿Cómo lo probaste? Soy completamente nuevo en las herramientas de desarrollo de Chrome y no puedo repetir lo que intenté ayer. No tengo idea de cómo encontré esto...

kaiser kaiser
30 ago 2011 00:35:22

xdebug_memory_usage() antes y después (obviamente necesita xdebug).

Rarst Rarst
30 ago 2011 00:47:56

@Vito Argos: Entonces mem_usage = ~88 bytes x XY usuarios. ¿Cuántos usuarios tienes?

kaiser kaiser
30 ago 2011 00:54:34

Los avatares no usan memoria real en el servidor. Eso es solo en el navegador. No te preocupes por eso.

Otto Otto
30 ago 2011 01:05:08

Kaiser, tengo 61 usuarios, pero solo estoy mostrando aquellos que tienen avatares en sus perfiles (16), el número aumentará con el tiempo.

@Otto, entonces ¿qué podría estar usando la mayor parte de la memoria? Por cierto, cuando quito los avatares la página carga perfectamente, todos los usuarios se muestran.

Vitor Argos Vitor Argos
30 ago 2011 01:26:39

Cuando desactivo mi plugin de boletines, este mensaje se muestra en la página de lista de usuarios: Error fatal: Memoria agotada (asignada 68943872) (intentó asignar 16000 bytes) en /home/organo/public_html/wp-includes/media.php en la línea 254

Vitor Argos Vitor Argos
30 ago 2011 01:32:27

@Rarst & Otto Gracias por probar, explicar y aclarar.

kaiser kaiser
30 ago 2011 19:37:32
Mostrar los 6 comentarios restantes