Utilizzo della memoria durante l'interrogazione degli utenti

29 ago 2011, 23:43:40
Visualizzazioni: 685
Voti: 2

Sto avendo un piccolo problema con una delle mie query. Non posso aumentare il limite di memoria di WordPress perché HostGator lo imposta a 64MB. Non sono sicuro se sia possibile ridurre la quantità di memoria utilizzata apportando alcune modifiche al mio codice. Ecco il codice che sto utilizzando per interrogare gli utenti di un ruolo specifico e visualizzare il loro nome, profilo e avatar:

<?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="Avatar predefinito" title="Avatar utente" />'; 
            } 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
Commenti

Non che io sia un sostenitore dell'accesso diretto al database, ma se ti trovi in situazioni di memoria estrema, potrebbe essere una soluzione per te? get_users() memorizzerà nella cache ogni utente "ottenuto" nella RAM; se hai un sacco di utenti, questo consumerà un'enorme quantità di RAM. Potresti aggirare questo problema con una query diretta al database.

Tom Auger Tom Auger
30 ago 2011 22:22:17
Tutte le risposte alla domanda 2
5

Nel tuo esempio, stai ottenendo tutti i campi nella chiamata get_users, ma in realtà stai utilizzando solo i campi ID e display_name. Quindi puoi risparmiare memoria forzando get_users a recuperare solo i campi necessari.

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

Questo aiuterà a ridurre l'utilizzo della memoria.

30 ago 2011 01:09:10
Commenti

Ehi Otto ho provato il tuo suggerimento ma il problema persiste :/

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

Potresti anche risparmiare un po' di memoria ottenendo il campo user_email e passandolo direttamente nella funzione get_avatar invece dell'ID utente.

Otto Otto
30 ago 2011 15:35:43

Inoltre, il tuo controllo per verificare se $avatar è vuoto è inutile, poiché get_avatar restituirà sempre un URL valido per l'avatar. Quindi anche la tua chiamata a stristr è superflua e consuma memoria senza motivo.

Otto Otto
30 ago 2011 15:36:29

Ehi Otto, ho appena capito e ho rimosso questa riga hehe, ma il problema della memoria è ancora presente. Ho anche provato a usare la paginazione ma senza successo. Sto pensando di cambiare l'indirizzo dell'avatar predefinito, così caricherà un'immagine presente sul mio localhost, pensi che farà la differenza?

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

A proposito, c'è un modo per verificare cosa sta effettivamente utilizzando la memoria su questa pagina?

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

Recuperare i dati dell'autore

Puoi sostituire le tue multiple chiamate get_the_author_meta() con una singola chiamata $author_data = get_userdata( $user_id );. Successivamente puoi semplicemente estrarre tutto dall'oggetto come $author_data->ID;. Questo dovrebbe farti risparmiare un po' di memoria.

Avatar

Se ometti l'avatar risparmierai anche molta memoria. Gli avatar impiegano molto tempo per caricarsi e utilizzano un'intera quantità di memoria.

29 ago 2011 23:51:33
Commenti

E per quanto riguarda le funzioni relative agli avatar che utilizzano molta memoria del server?..

Rarst Rarst
30 ago 2011 00:16:49

Ho appena dato un'occhiata a come l'avatar utilizza la memoria (tramite la barra di sviluppo di Chrome) ieri. Non capisco davvero perché, ma sembra che ci sia qualcosa al riguardo.

kaiser kaiser
30 ago 2011 00:19:44

in realtà l'avatar è la cosa principale di questa pagina, purtroppo. Ma proverò il tuo suggerimento Kaiser, non sono veramente sicuro che funzionerà, ma proviamoci. Grazie!

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

Non capisco. Come fa Chrome a mostrare l'utilizzo della memoria PHP? Da un rapido test la chiamata get_avatar() aumenta l'utilizzo della memoria di 88 byte.

Rarst Rarst
30 ago 2011 00:27:37

Come hai testato? Sono completamente nuovo alle strumentazioni di sviluppo di Chrome e non riesco a ripetere ciò che ho provato ieri. Non ho idea di come l'abbia trovato...

kaiser kaiser
30 ago 2011 00:35:22

xdebug_memory_usage() prima e dopo (ovviamente serve xdebug).

Rarst Rarst
30 ago 2011 00:47:56

@Vito Argos: Quindi mem_usage = ~88 byte x XY utenti. Quanti utenti hai?

kaiser kaiser
30 ago 2011 00:54:34

Gli avatar non utilizzano memoria reale sul server. Quella è solo nel browser. Non preoccupartene.

Otto Otto
30 ago 2011 01:05:08

Kaiser, ho 61 utenti, ma sto visualizzando solo quelli che hanno avatar associati ai loro profili (16), il numero aumenterà con il tempo.

@Otto, quindi cosa potrebbe utilizzare la maggior parte della memoria? A proposito, quando rimuovo gli avatar la pagina si carica perfettamente, tutti gli utenti vengono visualizzati.

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

Quando disattivo il mio plugin per le newsletter, questo messaggio viene visualizzato nella pagina dell'elenco utenti: Errore fatale: Memoria esaurita (allocati 68943872) (tentativo di allocare 16000 byte) in /home/organo/public_html/wp-includes/media.php alla riga 254

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

@Rarst & Otto Grazie per i test, la spiegazione e la chiarificazione.

kaiser kaiser
30 ago 2011 19:37:32
Mostra i restanti 6 commenti