Ankündigung

Einklappen
Keine Ankündigung bisher.

Speicherverbrauch nimmt zu

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Speicherverbrauch nimmt zu

    Hallo,
    ich habe folgendes Problem: Ich arbeite (wie ihr schon wisst) an einem PHPChat (wie immer, erspart bitte Diskussionen). Nun, es geht nun um den Speicherverbrauch. Einige werden wohl meinen letzten Thread noch kennen, in dem es um das Problem ging. Nun, ich konnte dies so weit eindämmen, dass sich der Speicherverbrauch nicht mehr so arg erhöht.
    Nur leider besteht das Problem immer noch, der Speicher wird pro Sekunde erhöht (1 Sekunde ist der Timeout zur Abfrage in der Datenbank nach einer neuen MessageID / dem UserTimeout). Ich hab ein bisschen herumprobiert, und festgestellt, dass der Fehler wohl an meiner MySQL-Klasse liegt - nur hab ich keine Ahnung, wie ich das beheben kann & wie ich hier die Referenzen setzen muss.
    Vielleicht etwas schräg und oversized (hab eben alles versucht), aber hier mal mein Ansatz:
    PHP-Code:
    <?php
            
    function &get_lastaction($uid) {
                     
    $mysql = &$this -> connection;
                     
    $mysql -> fetch_query("SELECT chatlastaction FROM ".$this->tblprefix."user WHERE id='$uid'");
                     
    $__lastaction = &$mysql -> record['chatlastaction'];
                     
    $mysql -> free_result();
                     return 
    $__lastaction;
                     
    $var time() + 1;
                     return 
    $var;
            }
    ?>
    Diese Funktion wird jede Sekunde im Script aufgerufen, um einmal die letzte Aktion des Users zu bestimmen.Durch Messungen im Script kann ich so den Speicher feststellen:
    PHP-Code:
    <?php
                    fwrite
    ($fp"Usage 1: " memory_get_usage() . "\r\n");
                    
    $lastaction = &$chat -> get_lastaction($user['id']);
                    if(
    time() - $lastaction >= 1200)
                            
    $noerror false;
                    
    fwrite($fp"Usage 2: " memory_get_usage() . "\r\n");
    ?>
    Hier stell ich einen stetigen Speicherzuwachs von 16 (Byte?) fest:
    Usage 1: 672056
    Usage 2: 672072
    (...)
    Usage 1: 672088
    Usage 2: 672104
    Nun, wenn ich in der oben genannten Funktion get_lastaction() den MySQL-Query rauslass und einfach eine Zahl oder variable zurückgeb, bleibt der Speicherverbrauch konstant - folglich liegt es an der MySQL-Klasse.
    PHP-Code:
    <?php
    function &fetch_query($query) {
             static 
    $rec = array();
             
    $this->query(&$query);
             
    $rec $this->search_query();
             return 
    $rec;
    }
    function &
    search_query() {
            
    $this->record mysql_fetch_array(&$this->query_id);
            
    $this->row += 1;
            
    $this->errno mysql_errno();
            
    $this->error mysql_error();
            
    $res is_array(&$this->record);
            if (!
    $res) {
                    
    mysql_free_result(&$this->query_id);
                    
    $this->query_id 0;
            }
            return 
    $res;
    }
    ?>
    Ich weiß, die Funktionen sind nicht auskommentiert, und auch noch PHP4.. Bitte keine Kommentare dazu
    Ich möchte nun wissen, wie muss ich meine Referenzen richtig setzen, sodass der Speicherverbrauch konstant bleibt?

  • #2
    return $__lastaction;
    $var = time() + 1;
    return $var;
    Was'n das?

    php hat seine eigene Speicherverwaltung. Nicht mehr benötigte (nicht mehr erreichbare) Variablen/Objekte/Resourcen werden irgendwann abgeräumt. Es ist aber nicht zugesichert, dass dies sofort passiert.
    Steigt der Speicherverbrauch über das memory_limit an?

    Kommentar


    • #3
      Zitat von Bruchpilot
      return $__lastaction;
      $var = time() + 1;
      return $var;
      Was'n das?
      Das war das, was ich zum tesetn eingerichtet hatte. Der Code nach dem return $__lastaction; wird hier ja eh nich mehr bearbeitet.
      Zitat von Bruchpilot
      php hat seine eigene Speicherverwaltung. Nicht mehr benötigte (nicht mehr erreichbare) Variablen/Objekte/Resourcen werden irgendwann abgeräumt. Es ist aber nicht zugesichert, dass dies sofort passiert.
      Steigt der Speicherverbrauch über das memory_limit an?
      Ja, das ganze lass ich mir per memory_get_usage ausgeben.

      Kommentar

      Lädt...
      X