S3Ri0US: Geschwindigkeit erhöhen ? PHP Optimieren ?

Hallo... ich habe mir ein eigenes kleines Forum gescriptet.. nur leider läd es extrem langsam... nun dachte ich, ob es evt. an folgenden funktionen liegen könnte und ob man diese wohl optimieren kann...

<?PHP

function replaceMessage($message) {
   $message    = strip_tags($message, '<b></b><i></i><u></u><a></a><img>');
   $message    = str_replace ("\n", "<BR>", "$message");
   $message    = str_replace("[singleQuote]", "'", $message);
   $message    = str_replace("[doubleQuote]", """, $message);
   $message    = str_replace ("[u]", "<U>", "$message");
   $message    = str_replace ("[/u]", "</U>", "$message");
   $message    = str_replace ("[img]", "[IMG]", "$message");
   $message    = str_replace ("[/img]", "[/IMG]", "$message");
   $message    = str_replace ("[url=", "URL=", "$message");
   $message    = str_replace ("[url]", "[URL]", "$message");
   $message    = str_replace ("[/url]", "[/URL]", "$message");
   $message    = str_replace ("[b]", "<B>", "$message");
   $message    = str_replace ("[/b]", "</B>", "$message");
   $message    = str_replace ("[B]", "<B>", "$message");
   $message    = str_replace ("[/B]", "</B>", "$message");
   $message    = str_replace ("[/rot]", "</font>", "$message");
   $message    = str_replace ("[rot]", "<font color='#AC0E0E'>", "$message");
   $message    = str_replace ("[/green]", "</font>", "$message");
   $message    = str_replace ("[green]", "<font color='#3E9217'>", "$message");
   $message    = str_replace (" :D", " <img border="0" src="images/smilies/smil1.gif"> ", "$message");
   $message    = str_replace (" :-)", " <img border="0" src="images/smilies/smil1.gif"> ", "$message");
   $message    = str_replace (":smil1:", " <img border="0" src="images/smilies/smil1.gif"> ", "$message");
   $message    = str_replace (":smil2:", " <img border="0" src="images/smilies/smil2.gif"> ", "$message");
   $message    = str_replace (":smil3:", " <img border="0" src="images/smilies/smil3.gif"> ", "$message");
   $message    = str_replace (":smil4:", " <img border="0" src="images/smilies/smil4.gif"> ", "$message");
   $message    = str_replace (":smil5:", " <img border="0" src="images/smilies/smil5.gif"> ", "$message");
   $message    = str_replace (":smil6:", " <img border="0" src="images/smilies/smil6.gif"> ", "$message");
   $message    = str_replace (":smil7:", " <img border="0" src="images/smilies/smil7.gif"> ", "$message");
   $message    = str_replace (":smil8:", " <img border="0" src="images/smilies/smil8.gif"> ", "$message");
   $message    = str_replace (":smil9:", " <img border="0" src="images/smilies/smil9.gif"> ", "$message");
   $message    = str_replace (":smil10:", " <img border="0" src="images/smilies/smil10.gif"> ", "$message");
   $message    = str_replace (":smil11:", " <img border="0" src="images/smilies/smil11.gif"> ", "$message");
   $message    = str_replace (":smil12:", " <img border="0" src="images/smilies/smil12.gif"> ", "$message");
   $message    = str_replace (":smil13:", " <img border="0" src="images/smilies/smil13.gif"> ", "$message");
   $message    = str_replace ("[/quote]", "[/zitat]", "$message");
   $message    = str_replace ("[quote]", "[zitat]", "$message");
   $message    = str_replace ("[zitat]", "<center><br><table class='zitattable' cellspacing='0' cellpadding='0'><tr><td><b>Zitat:</b><br>", "$message");
   $message    = str_replace ("[/zitat]", "<br><br></td></tr></table></center><br>", "$message");
   $message    = replaceImg($message);
   $message    = preg_replace("/[URL=(.*?)](.*?)[/URL]/", "<a href="$1" class="reviewlink" alt="" target="blank">$2</a>", $message);
   $message    = preg_replace("/[URL
[/URL]/", "<a href="$1" class="reviewlink" alt="" target="blank">$1</a>", $message);
   $message    = str_replace ("[weiss]", "", "$message");
   $message    = str_replace ("[/weiss]", "", "$message");
   return $message;
}
function replaceImg($message) {
   if (strpos($message, "[IMG]")!==false){
       $begImg = strpos($message, "[IMG]");
       $endImg = strpos($message, "[/IMG]");
       $img = substr($message, $begImg, $endImg-$begImg+6);
       $link = substr($img, 5, $endImg - $begImg -5);

$fileinfos = getimagesize($link);
    $type = $fileinfos[2]; // 2 = JPG
    $breite = $fileinfos[0];
    $hoehe = $fileinfos[1]
    ;
    unset($fileinfos);

if($type=="1") {
     $type = "GIF";
    } else if($type=="2") {
     $type = "JPG";
    } else if($type=="3") {
     $type = "PNG";
    }

if($type==null) {
       $link = "images/picoffline.jpg";
       $breite = "200";
       $hoehe = "80";
       }

if($breite > "400") {
         $htmlImg = "<center><br><a href='$link' rel='lightbox' title='.. 700FPS.de ..'><img src=$link border='1' width='400'></a><br><div class='style1'>Breite: $breite - Höhe: $hoehe - Type: $type</div><br></center>";
       } else {
         $htmlImg = "<center><br><img src=$link border='1' width='$breite' height='$hoehe'><br></center>";
       }
       $message = str_replace($img, $htmlImg, $message);
       $message = replaceImg($message);
   }
   unset($link,$img,$htmlImg,$breite,$hoehe,$type);
   return $message;
}

function SetRang($a_posts)
{
    if($a_posts == 2000 OR $a_posts > 2000) {
        $rang="General";
    } else if($a_posts == 1600 OR $a_posts > 1600) {
        $rang="Generalleutnant";
    } else if($a_posts == 1600 OR $a_posts > 1600) {
        $rang="Generalleutnant";
    } else if($a_posts == 1400 OR $a_posts > 1400) {
        $rang="Generalmajor";
    } else if($a_posts == 1200 OR $a_posts > 1200) {
        $rang="Brigadegeneral";
    } else if($a_posts == 1000 OR $a_posts > 1000) {
        $rang="Oberst";
    } else if($a_posts == 800 OR $a_posts > 800) {
        $rang="Major";
    } else if($a_posts == 650 OR $a_posts > 650) {
        $rang="Hauptmann";
    } else if($a_posts == 550 OR $a_posts > 550) {
        $rang="Oberleutnant";
    } else if($a_posts == 450 OR $a_posts > 450) {
        $rang="Leutnant";
    } else if($a_posts == 350 OR $a_posts > 350) {
        $rang="Hauptfeldwebel";
    } else if($a_posts == 250 OR $a_posts > 250) {
        $rang="Feldwebel";
    } else if($a_posts == 150 OR $a_posts > 150) {
        $rang="Unteroffizier";
    } else if($a_posts == 50 OR $a_posts > 50) {
        $rang="Hauptgefreiter";
    } else if($a_posts == 25 OR $a_posts > 25) {
        $rang="Gefreiter";
    } else if($a_posts == 15 OR $a_posts > 15) {
        $rang="Soldat";
    } else if($a_posts == 0 OR $a_posts < 15) {
        $rang="Neuling";
    }
  return $rang;
}

  1. Hi

    probiere es bei der Funktion replace_message() mal mit regulären Ausdrücken (Regular Expressions= RegEx), die du in den PHP-Funktionen preg_replace() und/oder ereg_replace() anwenden kannst. Das wäre in jedem Fall schneller.
    Allerdings greift deine Funktion replace_messager() ja nur beim Darstellen von Postings, aber nicht unbedingt beim Laden der Startseite (was du ja meinst).

    function SetRang($a_posts)
    {
        if($a_posts == 2000 OR $a_posts > 2000) {
            $rang="General";
        } else if($a_posts == 1600 OR $a_posts > 1600) {
            $rang="Generalleutnant";
        } else if($a_posts == 1600 OR $a_posts > 1600) {
            $rang="Generalleutnant";
        } else if($a_posts == 1400 OR $a_posts > 1400) {
            $rang="Generalmajor";
        } else if($a_posts == 1200 OR $a_posts > 1200) {
            $rang="Brigadegeneral";
        } else if($a_posts == 1000 OR $a_posts > 1000) {
            $rang="Oberst";
        } else if($a_posts == 800 OR $a_posts > 800) {
            $rang="Major";
        } else if($a_posts == 650 OR $a_posts > 650) {
            $rang="Hauptmann";
        } else if($a_posts == 550 OR $a_posts > 550) {
            $rang="Oberleutnant";
        } else if($a_posts == 450 OR $a_posts > 450) {
            $rang="Leutnant";
        } else if($a_posts == 350 OR $a_posts > 350) {
            $rang="Hauptfeldwebel";
        } else if($a_posts == 250 OR $a_posts > 250) {
            $rang="Feldwebel";
        } else if($a_posts == 150 OR $a_posts > 150) {
            $rang="Unteroffizier";
        } else if($a_posts == 50 OR $a_posts > 50) {
            $rang="Hauptgefreiter";
        } else if($a_posts == 25 OR $a_posts > 25) {
            $rang="Gefreiter";
        } else if($a_posts == 15 OR $a_posts > 15) {
            $rang="Soldat";
        } else if($a_posts == 0 OR $a_posts < 15) {
            $rang="Neuling";
        }
      return $rang;
    }

    Diese Abfragen kannst du auch per switch() und case lösen, das ist "stilvoller".

    MfG
    trinni

    1. Hi

      probiere es bei der Funktion replace_message() mal mit regulären Ausdrücken (Regular Expressions= RegEx), die du in den PHP-Funktionen preg_replace() und/oder ereg_replace() anwenden kannst. Das wäre in jedem Fall schneller.

      Was?
      Reguläre Ausdrücke sollen schneller als einfache Ersetzungen auf Binär-Basis? Das wage ich aber zu bezweifeln. Vermutlich liegt das Problem eher in den Datenbankabfragen.

      1. Danke schon mal für eure Antworten...

        Diese Abfragen kannst du auch per switch() und case lösen, das ist "stilvoller".....

        Werde ich mir mal anschauen.

        Hmm wenn das auch nichts bringt wird es wohl an der DB liegen... ich rude die Antowrten über eine  WHILE schleiffe auf... Max 10 Antowrten pro seite..

        ......

        $antworten = "SELECT id,thread,byuser,text,datum,zeit,posttime FROM forum_antwort WHERE thread='$id' ORDER by posttime ASC LIMIT $start,$stop";
                                    $erga = mysql_db_query("700fps_d",$antworten,$verbindung);
                                    while (list($aid,$threadid,$auser,$atext,$adatum,$azeit,$posttime) = mysql_fetch_row($erga))
                                    {
                                        $whileuserabfrage = "SELECT isAllowed,posts,signatur,avatar,regdate,lastaction,session_id,isMod,isAdmin,isPayuser FROM Users WHERE name='$auser'";
                                        $ergwhile = mysql_db_query("700fps_d",$whileuserabfrage,$verbindung);
                                        list($a_isallowed,$a_posts,$a_signatur,$a_avatar,$a_regdate,$a_lastaction,$a_session_id,$a_isMod,$a_isAdmin,$a_isPayuser)= mysql_fetch_row($ergwhile);

        $sql = "SELECT id FROM verwarnungen WHERE user='$auser'";
                                        $res = mysql_query($sql);
                                        $a_verwarnungen = mysql_num_rows($res);

        if($a_isallowed=="1") {
                                            $a_isallowed="Nein";
                                        } else {
                                            $a_isallowed="Ja";
                                        }

        if(!empty($a_session_id) OR $session_id != "0") {
                                            $a_ip="Nein";
                                        } else {
                                            $a_ip="Ja";
                                        }

        if(empty($a_avatar)) {
                                            $a_avatar = "<img border="1" src='useravatars/noavatar.jpg' width="80" height="100">";
                                        } else {
                                            $a_avatar = "<img border="1" src='useravatars/$a_avatar' width="80" height="100">";
                                        }

        $lastaY = substr($a_lastaction, 0, 4);
                                        $lastaM = substr($a_lastaction, 4, 2);
                                        $lastaD = substr($a_lastaction, 6, 2);
                                        $a_lastaction = "$lastaD.$lastaM.$lastaY";

        $rang = SetRang($a_posts);

        if($a_isMod=="1") {
                                            $a_status = "Mod";
                                        } else if($a_isAdmin=="1") {
                                            $a_status = "Admin";
                                        } else {
                                            $a_status = "Member";
                                        }

        if(empty($a_signatur)) {
                                            $a_signatur = "<br>";
                                        } else {
                                            $a_signatur = replaceMessage($a_signatur);
                                            $a_signatur = "<br>---<br><br>$a_signatur";
                                        }

        1. Mahlzeit,

          $antworten = "SELECT id,thread,byuser,text,datum,zeit,posttime FROM forum_antwort WHERE thread='$id' ORDER by posttime ASC LIMIT $start,$stop";
                                      $erga = mysql_db_query("700fps_d",$antworten,$verbindung);
                                      while (list($aid,$threadid,$auser,$atext,$adatum,$azeit,$posttime) = mysql_fetch_row($erga))
                                      {
                                          $whileuserabfrage = "SELECT isAllowed,posts,signatur,avatar,regdate,lastaction,session_id,isMod,isAdmin,isPayuser FROM Users WHERE name='$auser'";
                                          $ergwhile = mysql_db_query("700fps_d",$whileuserabfrage,$verbindung);
                                          list($a_isallowed,$a_posts,$a_signatur,$a_avatar,$a_regdate,$a_lastaction,$a_session_id,$a_isMod,$a_isAdmin,$a_isPayuser)= mysql_fetch_row($ergwhile);

          $sql = "SELECT id FROM verwarnungen WHERE user='$auser'";

          Allein DAS geht schon in EINER Abfrage ... informiere dich mal über JOINs!

          MfG,
          EKKi

          1. Hallo

            Allein DAS geht schon in EINER Abfrage ... informiere dich mal über JOINs!

            dazu empfehle ich gern die Join-Artikel in SELFHTML aktuell:

            Einführung in Joins
            Fortgeschrittene Jointechniken

            Freundliche Grüße

            Vinzenz

    2. echo $begrüßung;

      if($a_posts == 2000 OR $a_posts > 2000) {
              $rang="General";
          } else if($a_posts == 1600 OR $a_posts > 1600) {
              $rang="Generalleutnant";
      Diese Abfragen kannst du auch per switch() und case lösen, das ist "stilvoller".

      Kann man, aber für diesen Fall müsste man einen eher ungewöhlichen Aufruf von switch verwenden:

      switch (true) {
          case $a_posts >= 2000:
            $rang = 'General';
          case $a_posts >= 1600:
            $rang = 'Generalleutnant';
          ...
        }

      echo "$verabschiedung $name";

  2. echo $begrüßung;

    Hallo... ich habe mir ein eigenes kleines Forum gescriptet.. nur leider läd es extrem langsam... nun dachte ich, ob es evt. an folgenden funktionen liegen könnte und ob man diese wohl optimieren kann...

    So funktioniert optimieren nicht. Wie willst du den Erfolg der Opeation feststellen, wenn du nicht weißt, wieviel Laufzeit dein Optimierungsversuch gespart hat? Ist es nicht zunächst sowieso sinnvoller, die Laufzeit einzelner Programmteile zu messen, um den/die Laufzeitverbraucher festzustellen?

    Für die Laufzeitmessung kannst du microtime() verwenden. Anwendungsbeispeil ist im Handbuch, beachte den Unterschied zwischen PHP4 und 5 beim Aufruf der Funktion.

    if($a_posts == 2000 OR $a_posts > 2000) {

    PHP kennt auch Operatoren, die gleich und größer bzw. gleich und kleiner gleichzeitig ermitteln:

    if ($a_posts >= 2000) {

    echo "$verabschiedung $name";

  3. /[URL=(.*?)](.*?)[/URL]/

    So was muss ich scharf bemängeln!
    Das erzeugt invaliden Code und zerstört dir das Layout.
    Überlege dir was deine Gäste alles machen können!

    /[URL=https?://[^[]]+?)]([^[]]+?)[/URL]/
    Wenn schon

    Ich halte nix von dieser Art BB-Code.

    [LINK:[URL:Adresse][LABEL:Beschriftung]]
    ...schafft eine klare Syntax welche dir später Fehler im HTML Code vermeiden hilft.

    (Ich komme zwar von perl her aber das wird wohl auch auf PHP zutreffen)
    mfg Beat

  4. n'abend,

    Hallo... ich habe mir ein eigenes kleines Forum gescriptet.. nur leider läd es extrem langsam... nun dachte ich, ob es evt. an folgenden funktionen liegen könnte und ob man diese wohl optimieren kann...

    Du möchtest deine SQL Anfragen, sofern du eine Datenbank für die Speicherung deiner Daten benutzt, analysieren. Dazu stellst du deinen Anfragen (bei MySQL) einfach ein "EXPLAIN" voran. Z.B.:

    EXPLAIN SELECT posts FROM forum WHERE thread = 4711

    Du bekommst dann angezeigt, wie die Datenbank diene Anfrage versteht und umsetzt. Oft vergessen Leute einfach sinnvolle™ Indexe (Indice) zu benutzen.

    Siehe: Optimizing Queries with Explain

    Dann solltest du dich Fragen ob dein Forum öfter gelesen wird, oder öfter verändert (also gepostet) wird. Im ersten Fall ist es unnötig, dass für jede Anfrage dein Forum zu lesen (a) die Datenbank konsultiert wird und (b) dein BBCode-Gedöns über die Beiträge stolpert. Du möchtest die generierten Seiten (oder zumindest die zwischenspeicherbaren Daten) zwischenspeichern (cachen). Das bedeutet, dass du bei einem Aufruf des Forums schaust, ob die entsprechende Seite bereits in generierter Form zwischengespeichert wurde, wenn ja, lieferst du den Zwischenspeicher aus (und greifst noch nicht mal auf deine Datenbank zu). Wenn nicht, gehst du dem normalen prozedere nach und speicherst am Ende der Generierung die Ergebnisse einfach ab (z.B. in eine Datei). Wenn nun jemand im Forum atwortet, löscht du einfach die entsprechenden zwischenspeicher, damit keine alten Daten ausgeliefert werden.

    weiterhin schönen abend...

    --
    Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
    sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|