Christoph: Function für Serverüberlastung verantwortlich?

Hallo zusammen,

leider komme ich nicht weiter, da ich in einer von mir geschriebenen Function keinen Fehler entdecken kann. Von Anfang an: Ich habe eine Function geschrieben, die Daten aus einer MySQL-Tabelle ausließt und ausgibt.
Das läuft auch alles so wie ich das möchte, und lief auch bereits einige Tage flüssig auf meinem Server. Gestern nun, ist auf einmal der komplette Server abgeschmiert und der Techniker hat mich wissen lassen, dass es wohl an einer Speicherüberlastung durch eine nicht geschlossene Variable und Co. liegt. Da ich in den letzten Tagen nur an einer Function meiner Seite grundlegend was verändert habe, gehe ich davon aus, dass der Fehler irgendwo in dieser steckt.
Leider finde ich in dieser Function eben diesen Fehler nicht und nach meiner Auffassung, müsste das ganze problemlos laufen.

Die Function sieht wie folgt aus und ich würde mich freuen, wenn ihr mal drüber schauen könntet und mir ein Feedback gebt, ob sich darin ein Fehler befindet.

Function: http://www.hiphop-pott.de/function_beispiel.txt

Vielen Dank,
Christoph

  1. Hallo Christoph,

    Was hast Du an Deiner Funktion geändert? Das könnte die Suche vielleicht eingrenzen.

    Viele Grüße,

    Stefan

    1. Hallo Christoph,

      Was hast Du an Deiner Funktion geändert? Das könnte die Suche vielleicht eingrenzen.

      Viele Grüße,

      Stefan

      Hallo Stefan,

      die original Function sieht so aus:

      function get_buddies_list(&$data, $mode = '')
      {
       global $db, $lang, $template, $theme, $images, $phpEx;

      $current_time = time();
       $session_time = 60;
       $end_session = $current_time - $session_time;

      $sql = "SELECT b.buddy_id, u.username AS buddy_name, u.user_allow_viewonline, u.user_session_time
         FROM " . BUDDIES_TABLE . " b, " . USERS_TABLE . " u
         WHERE b.user_id = " . $data['user_id'] . "
          AND u.user_id = b.buddy_id
         ORDER BY u.username ASC";
       if( !$result = $db->sql_query($sql) )
       {
        message_die(GENERAL_ERROR, 'Could not query buddies information', '', __LINE__, __FILE__, $sql);
       }

      $buddies = array();
       while( $row = $db->sql_fetchrow($result) )
       {
        $buddies[] = $row;
       }
       $db->sql_freeresult($result);

      //
       // Dump vars to template
       //
       $template->assign_vars(array(
        'L_BUDDYLIST' => $lang['Buddylist']
        )
       );

      //
       // Okay, let's build the online buddies list
       //
       $s_buddies = '';
       if( count($buddies) == 0 )
       {
        $s_buddies = $lang['No_buddies'];
       }
       else
       {
        for( $i = 0; $i < count($buddies); $i++ )
        {
         $buddy_id = $buddies[$i]['buddy_id'];

      if( ($buddies[$i]['user_allow_viewonline'] || $data['user_level'] == ADMIN) && ($buddies[$i]['user_session_time'] >= $end_session) )
         {
          $buddy_name = '<b>' . $buddies[$i]['buddy_name'] . '</b>';
         }
         else
         {
          $buddy_name = $buddies[$i]['buddy_name'];
         }

      $temp_url = append_sid("profile.$phpEx?mode=viewprofile&amp;" . POST_USERS_URL . "=$buddy_id");
         $buddy_profile = '<a href="' . $temp_url . '">' . $buddy_name . '</a>';

      $temp_url = append_sid("privmsg.$phpEx?mode=post&amp;" . POST_USERS_URL . "=$buddy_id");
         $buddy_pm = '<a href="' . $temp_url . '">' . $buddy_name . '</a>';

      $s_buddies .= ( ( $s_buddies != '' ) ? ', ' : '' ) . ( ( $mode == 'pm' ) ? $buddy_pm : $buddy_profile );
        }
       }

      $template->assign_vars(array(
        'S_BUDDIES' => $s_buddies
        )
       );

      return;
      }

      Gruß
      Christoph

  2. echo $begrüßung;

    leider komme ich nicht weiter, da ich in einer von mir geschriebenen Function keinen Fehler entdecken kann.

    Die Variable $action wird nicht initialisiert und es gibt einen Klammerfehler kurz vor dem return. Das sind nur die offensichtlichen Fehler.

    Gestern nun, ist auf einmal der komplette Server abgeschmiert und der Techniker hat mich wissen lassen, dass es wohl an einer Speicherüberlastung durch eine nicht geschlossene Variable und Co. liegt.

    Variablen sind einfach da, weder geöffnet noch geschlossen. Sie haben lediglich unterschiedlich langen Inhalt. Und manchmal verbraucht man (zu) viel Speicher, wenn man z.B. große Dateien in sie einliest.
    Verbindungen können geöffnet sein, manchmal zu viele gleichzeitig. Doch beim Scriptende werden sie ebenso wie der belegte (Variablen-)Speicherplatz automatisch freigegeben.
    Wenn ein Script zu viel Ressourcen in Anspruch nimmt muss du es direkt untersuchen. Anhand des Quelltextes allein ist das kaum möglich. Besonders dann nicht, wenn es auf externe Ressourcen zugreift. Denn von deren Antworten hängt es ja oft ab, wieviele Schleifendurchläufe stattfinden, wieviel Daten zwischengepuffert werden müssen, ob es gegebenenfalls hängenbleibt, usw. usf.

    echo "$verabschiedung $name";

    1. »»»» Die Variable $action wird nicht initialisiert und es gibt einen Klammerfehler kurz vor dem return. Das sind nur die offensichtlichen Fehler.

      Was für ein Klammefehler genau? Habe ich eine Klammer vergessen oder schreibt man dort etwas anders?

      Gruß

      1. echo $begrüßung;

        »»»» Die Variable $action wird nicht initialisiert und es gibt einen Klammerfehler kurz vor dem return. Das sind nur die offensichtlichen Fehler.
        Was für ein Klammefehler genau? Habe ich eine Klammer vergessen oder schreibt man dort etwas anders?

        $template->assign_vars(array(
            'S_BUDDIES' => $s_buddies,
            'S_BUDDIES_AN' => $buddyanzahl
            )

        return;

        Die Klammer-zu von assign_vars() und das abschließende Semikolon nach diesem Funktionsaufruf fehlen. Möglicherweise ist es ein Copy&Paste-Fehler, den du im Original nicht hast, denn da seit PHP4 vor der Ausführung zuerst die gesamte Datei geparst wird, fiele dieser Fehler sofort beim ersten Aufrufversuch auf.

        echo "$verabschiedung $name";

        1. Die Klammer-zu von assign_vars() und das abschließende Semikolon nach diesem Funktionsaufruf fehlen. Möglicherweise ist es ein Copy&Paste-Fehler, den du im Original nicht hast, denn da seit PHP4 vor der Ausführung zuerst die gesamte Datei geparst wird, fiele dieser Fehler sofort beim ersten Aufrufversuch auf.

          Habe ich wieder hinzugefügt die Klammer und das Semikolon. War ein Copy&Paste-Fehler.

          Nun ist aber immer noch meine Frage, ob diese Function für die Serverüberlastung verantwortlich sein konnte.
          Siehst du in dieser Function noch irgendwo einen wirklichen Fehler oder sollte die Function deiner Meinung nach problemlos laufen?

          Gruß
          Christoph

          1. echo $begrüßung;

            Nun ist aber immer noch meine Frage, ob diese Function für die Serverüberlastung verantwortlich sein konnte.

            Das lässt sich auch so nicht beantworten.

            Siehst du in dieser Function noch irgendwo einen wirklichen Fehler oder sollte die Function deiner Meinung nach problemlos laufen?

            In dem Code kann ich nichts Verdächtiges sehen, aber das ist ja auch nicht deine vollständige Anwendung. Du rufst Funktionen auf, die nicht zum Lieferumfang von PHP gehören. Dort können sich auch Fehler drin befinden. Und dann sind da ja noch deine zu verarbeitenden Daten, die Einfluss auf das Laufzeitverhalten haben.

            Ich schätze, dir wird nichts weiter übrigbleiben, als mitzuloggen, welche Code-Teile wie lange brauchen, um dann dort weiter zu forschen. Schwierig wird es, wenn der Fehler nur sporadisch auftritt ...

            echo "$verabschiedung $name";

            1. In dem Code kann ich nichts Verdächtiges sehen, aber das ist ja auch nicht deine vollständige Anwendung. Du rufst Funktionen auf, die nicht zum Lieferumfang von PHP gehören. Dort können sich auch Fehler drin befinden. Und dann sind da ja noch deine zu verarbeitenden Daten, die Einfluss auf das Laufzeitverhalten haben.

              Da die Function aus dem phpBB-Forum Code ist und von mir nur an meine Bedürfnisse angepasst wurde, sollte die Grundfunction und auch das Datenauslesen ohne Überlastung funktionieren, da ich nach dem Überlasten des Servers die Function wieder auf die original Function zurückgestellt habe und das ganze problemlos läuft.

              Was die verarbeitung der Daten angeht, können da ja eigentlich nicht wirklich viele Möglichkeiten der Überlastung sein, da ich ja lediglich die Datenbank auslese und das ganze in einer FOR-Schleife ausgebe.

              Ich werde nochmal schauen bzw. die jetzige Function einfach nochmal online setzen und schauen, ob der Server dann wirklich wieder in die Knie geht oder ob der Fehler in dieser Function ausgeschlossen ist.

              Gruß
              Christoph