Utilizarea memoriei la interogarea utilizatorilor

29 aug. 2011, 23:43:40
Vizualizări: 685
Voturi: 2

Am o mică problemă cu una dintre interogările mele aici. Nu pot crește limita de memorie WordPress deoarece HostGator o setează la 64MB. Nu sunt sigur dacă este posibil să reduc cantitatea de memorie utilizată făcând unele modificări în codul meu, iată codul pe care îl folosesc pentru a interoga utilizatorii dintr-un anumit rol și pentru a afișa numele, profilul și avatarul lor:

<?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" title="Avatar implicit" />'; 
            } 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
Comentarii

Nu că aș fi un susținor al accesului direct la baza de date, dar dacă te confrunți cu situații extreme de memorie, asta ar putea fi o soluție pentru tine? get_users() va stoca în cache fiecare utilizator "obținut" în RAM; dacă ai o grămadă de utilizatori, asta va consuma o tonă de memorie RAM. S-ar putea să ocoliți această problemă cu o interogare directă la baza de date.

Tom Auger Tom Auger
30 aug. 2011 22:22:17
Toate răspunsurile la întrebare 2
5

În exemplul tău, obții toate câmpurile în apelul get_users, dar folosești doar câmpurile ID și display_name. Astfel, poți economisi memorie forțând get_users să returneze doar câmpurile de care ai nevoie.

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

Aceasta va ajuta la reducerea consumului de memorie.

30 aug. 2011 01:09:10
Comentarii

Hei Otto, am încercat sugestia ta, dar problema persistă :/

Vitor Argos Vitor Argos
30 aug. 2011 01:26:57

Ai putea economisi puțină memorie prin obținerea câmpului user_email și transmiterea acestuia direct în funcția get_avatar în loc de ID-ul utilizatorului.

Otto Otto
30 aug. 2011 15:35:43

Mai mult, verificarea ta pentru $avatar fiind gol este inutilă, deoarece get_avatar va returna întotdeauna o adresă URL validă pentru avatar. Deci apelul tău la stristr este, de asemenea, inutil și consumă memorie fără niciun motiv.

Otto Otto
30 aug. 2011 15:36:29

Hei Otto, tocmai am aflat și am eliminat această linie hehe, dar problema cu memoria încă persistă. Am încercat și să folosesc paginare, dar fără succes. Mă gândesc să schimb adresa implicită a avatarului, astfel încât să încarce o imagine de pe localhost-ul meu, crezi că va face vreo diferență?

Vitor Argos Vitor Argos
30 aug. 2011 15:41:32

Apropo, există vreo modalitate prin care pot verifica ce anume utilizează memoria pe această pagină?

Vitor Argos Vitor Argos
30 aug. 2011 15:42:40
11

Apelarea datelor autorului

În loc să folosești multiple apeluri get_the_author_meta(), poți utiliza un singur apel $author_data = get_userdata( $user_id );. Apoi poți extrage toate datele din obiect, de exemplu $author_data->ID;. Acest lucru ar trebui să economisească memorie.

Avatar

Dacă renunți la afișarea avatarului, vei economisi multă memorie. Avatarii necesită mult timp pentru încărcare și utilizează o cantitate mare de memorie.

29 aug. 2011 23:51:33
Comentarii

Ce zici de funcțiile legate de avatar care folosesc multă memorie de server?..

Rarst Rarst
30 aug. 2011 00:16:49

Tocmai am verificat ieri cum folosește avatarul memoria (prin bara de dezvoltator Chrome). Nu înțeleg cu adevărat de ce, dar se pare că este ceva în legătură cu asta.

kaiser kaiser
30 aug. 2011 00:19:44

de fapt avatarul este principalul lucru despre această pagină, din păcate. Dar voi încerca sugestia ta Kaiser, nu sunt sigur dacă va funcționa, dar hai să încercăm. Mulțumesc!

Vitor Argos Vitor Argos
30 aug. 2011 00:26:54

Nu înțeleg. Cum afișează Chrome utilizarea memoriei PHP? Dintr-un test rapid, apelul get_avatar() crește utilizarea memoriei cu 88 de octeți.

Rarst Rarst
30 aug. 2011 00:27:37

Cum ai testat? Sunt complet nou în instrumentele de dezvoltare Chrome și nu pot repeta ce am încercat ieri. Nu știu cum am găsit asta...

kaiser kaiser
30 aug. 2011 00:35:22

xdebug_memory_usage() înainte și după (necesită evident xdebug).

Rarst Rarst
30 aug. 2011 00:47:56

@Vito Argos: Deci mem_usage = ~88 bytes x XY utilizatori. Câți utilizatori ai?

kaiser kaiser
30 aug. 2011 00:54:34

Avatarurile nu folosesc memorie reală pe server. Asta este doar în browser. Nu-ți face griji pentru asta.

Otto Otto
30 aug. 2011 01:05:08

Kaiser, am 61 de utilizatori, dar afișez doar pe cei care au avataruri atașate profilului lor (16), numărul va crește în timp.

@Otto, deci ce ar putea folosi cea mai mare parte a memoriei? Apropo, când elimin avatarurile pagina se încarcă perfect, toți utilizatorii sunt afișați.

Vitor Argos Vitor Argos
30 aug. 2011 01:26:39

Când dezactivez plugin-ul meu de newsletter, acest mesaj este afișat pe pagina listei de utilizatori: Eroare fatală: Memorie insuficientă (alocat 68943872) (încercat să aloce 16000 de octeți) în /home/organo/public_html/wp-includes/media.php la linia 254

Vitor Argos Vitor Argos
30 aug. 2011 01:32:27

@Rarst & Otto Mulțumesc pentru testare, explicație și clarificare.

kaiser kaiser
30 aug. 2011 19:37:32
Arată celelalte 6 comentarii