Code Beschleunigen??

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

  • Code Beschleunigen??

    hi,

    ich hab mal ne frage!

    kann man diesen code so umschreiben das dies schneller ausgeführt wird?
    Denn dieser Code funktioniert zwar aber er ist ziemlich langsam.

    hier mal der Code:

    PHP-Code:
    $file="lib/php_list.php"# Datei mit den ganzen php befehlen
    $phplistersatz1='<a href="http://de.php.net/manual/de/function.'
    $phplistersatz2='.php" onclick="window.open(\\\'http://de.php.net/manual/de/function.';
    $phplistersatz2a='.php\\\'); return false">';
    $phplistersatz3='</a>';
    $phplistsuche=array(); 


    $phplistsuche=file($file);

    $phplistsuche=array_reverse($phplistsuche); 
    $count=count($phplistsuche)-1;


            while (list(
    $val,$nex) = each($phplistsuche)) 
            {
            
    $line=trim($nex); 
            
    $BBCodes preg_replace('#(.*[^a-zA-Z0-9])'.$line.'(.*[^a-zA-Z0-9])#i',
    '$1'.$phplistersatz1.strtolower($line).$phplistersatz2.strtolower($line).
    $phplistersatz2a.$line.$phplistersatz3.'$2',$BBCodes,-1); 
            } 
    in der Datei php_list.php stehen alle PHP Befehle.

    Funktion:
    Ich möchte aus einem Text der aus einer DB geladen wird alle
    Wörter, die PHP Befehle sind (wie in der datei angegeben)´,
    als Link darstellen.

  • #2
    was ist denn die bremse? die regulären ausdrücke vermutlich?
    kann man da nicht einfache string-fkt. nutzen?

    Kommentar


    • #3
      was da die bremse ist weiß ich nicht, weiß nur das die Seite anstatt 0,05 sec jetzt 2,5 sec brauch um generiert zu werden.

      in der Datei stehen die befehle unter einander.
      also so:

      .....
      chdir
      checkdate
      checkdnsrr
      chgrp
      chmod
      chop
      chown
      chr
      chroot
      chunk_split
      .....

      will ja auch nicht das der mir andere Wörter zur hälfte als link erstellt
      wie zb. das Wort "dieser" hier würde er wie ich es vorher hatte "die"
      als link erstellen und "er" hinten dran hängen.

      so hatte ich dies vorher:

      hier als bsp. ohne ersatz aber auch in der while Schleife.

      PHP-Code:
      $BBCodes=str_replace($nexstrtolower($nex) , $BBCodes); 
      Weiß nicht wie ich es anders lösen könnte.
      über einen lösungsvorschlag würde ich mich freuen!

      Kommentar


      • #4
        Hää..
        suchst du http://www.christian-seiler.de/proje...ode/index.html
        oder(und) http://qbnz.com/highlighter/

        Liege ich jetzt ganz daneben??
        Zuletzt geändert von combie; 27.09.2006, 21:12.
        Wir werden alle sterben

        Kommentar


        • #5
          hi Phoenix666
          sei bitte nicht böse,
          aber wenn du deine Code optimieren willst, dann lösche alles am bestens, und fange neu an.

          ich kann nicht deine
          array_reverse,
          list($val,$nex) = each($phplistsuche),
          preg_replace

          nachvollziehen.
          ---------------------------------------
          Vorschlag

          1) du erstellst eine Tabelle in datenbank
          id | func
          und fühlst diese Tabelle mit den functionen

          Tip: http://de2.php.net/manual/de/functio...-functions.php

          2)du schaust in der Tabelle ob da die wörter gibt, die in deinem Text vorkommen.
          Tip:
          SELECT func FROM funktionen WHERE LOCATE(func, '$deintext')<>0
          damit begrenzt du deine suche, und muss nicht das ganze durchlaufen

          3)
          jetzl liest du in einer schleife diese ergebnisse und
          machst direckt in deiner schleife ein pregreplace
          Tip:
          $text=preg_replace('/(\b'.preg_quote($erg['func']).')\(/ie' , .....


          4)wenn du dich doch für eine datei entscheidest, dann schreib deine functionen in ein Array und speichere ihn in serializiertem zustand.
          Tip:
          http://de2.php.net/manual/de/function.serialize.php
          http://de2.php.net/manual/de/function.unserialize.php

          -----------------------------------------------------------------------------------
          ich will nicht sagen, dass mein Vorschlag einzig wahre lösung ist, aber ich glaube, dass die Richtung stimmt.
          Zuletzt geändert von Slava; 27.09.2006, 23:59.
          Slava
          bituniverse.com

          Kommentar


          • #6
            die aktuele liste von functionen, kannst du auch jetzt abfragen
            PHP-Code:
            $funk=file_get_contents('http://de2.php.net/manual/de/index.functions.php'); 
            $pattern = '/(?:^>([^<\(]++)\(\)<)/m';
            PHP-Code:
            preg_match_all($pattern,$funk $array,PREG_PATTERN_ORDER);
            print_r($array[1]); 
            Slava
            bituniverse.com

            Kommentar


            • #7
              Danke für eure antworten!

              werde dies alles mal testen und schaue was am besten ist.
              aber wenn ich fragen habe melde ich mich nochmal


              mfg

              Kommentar


              • #8
                Original geschrieben von Slava
                die aktuele liste von functionen, kannst du auch jetzt abfragen
                PHP-Code:
                $funk=file_get_contents('http://de2.php.net/manual/de/index.functions.php');
                $pattern '/(?:^>([^<\(]++)\(\)<)/m'
                Denk bitte daran, dass hierfür allow_url_fopen aktiviert sein muss!
                Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
                var_dump(), print_r(), debug_backtrace und echo.
                Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
                Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
                Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

                Kommentar


                • #9
                  Danke für den tip Shurakai aber das war mir schon bewusst

                  Hab das gemacht wie Slava vorgeschlagen hat, alle befehle in ne DB laden und von dort auslesen. Funzt alles wie gewollt und schnell
                  Und bis jetzt keine Weiteren Fragen
                  Danke !!


                  mfg

                  Kommentar


                  • #10
                    Original geschrieben von Phoenix666
                    Hab das gemacht wie Slava vorgeschlagen hat, alle befehle in ne DB laden und von dort auslesen. Funzt alles wie gewollt und schnell
                    ist die db tatsächlich so schnell?
                    find's irgendwie umständlich. ich hätte wahrscheinlich str_replace bzw. str_ireplace mit zwei arrays benutzt, denke mal ist schneller.

                    @Phoenix666 kannst du ja mal testen

                    Kommentar


                    • #11
                      ich muss ja auch irgendwo her die ganzen befehle bekommen.
                      vorher hatte ich die ja inner Datei, sind ja auch nicht wenig
                      und das war auch etwas langsam, ersetzt hab ich die dann mit preg_replace, str_replace hatte ich auch schon probiert aber hat nicht so hingehauen wie ich es haben wollte. Kann auch sein das ich dabei was falsch gemacht hab, aber so gehts ja.

                      zum vergleich mit viel text:

                      Befehle aus datei ausgelesen und im txt ersetzen: knapp 30 sec. Lade Zeit.
                      Befehle aus DB auslesen und im txt ersetzen: knapp 1 sec. Lade Zeit.

                      und das finde ich dann schon schneller.

                      aber ich bin immer für neue ideen offen

                      mfg

                      Kommentar


                      • #12
                        aber ich bin immer für neue ideen offen
                        ja, hatte ich dir doch schon genannt:
                        PHP-Code:
                        $functions=array('echo'=>'<a href="http://www.php.net/manual/de/function.echo.php">echo</a>');
                        $text='blub echo blub';
                        echo 
                        str_ireplace(array_keys($functions), $functions$text); 
                        also ein $functions-array anlegen. der key ist die funktion und das value die ersetzung.
                        ist mir auch klar, dass das ziemlich groß wird. aber ich kann mir nicht vorstellen, dass die db weniger ram verbraucht bzw. schneller ist.

                        und darum solltest du das mal testen, weil du möchtest eine schnelle lösung und ich würde gerne wissen, was effektiver ist.

                        auf alle fälle ist str_ireplace schneller als preg_replace, allerdings fällt dabei viel redundanz für die a-href's an - aber das könnte man auch noch ein wenig cleverer gestalten.

                        Kommentar


                        • #13
                          strreplace ist für diese aufgabe leider nicht ausreichend, da es noch mehrere bedingungen rein kommen.
                          damit es funktioniert, muss man kontrolieren, das vor der funktionsname[\.\s,\(] steht und (\s*\() am ende damit es nicht zur übersneidung kommt.

                          info:
                          Ausserdem funktioniert eine suche in Datenbank einwenig anderes als bei einem Array.
                          nehmen wir z.b.s in_array('was',$array) und
                          select etwas where etwas ='was'
                          zum fergleich.
                          im Array wird auf nativer Ebene jedereler Arrayelement in einer schleife verglichen (unser Array ist 3835 datensätze gross).
                          Bei einer indexierter Spalte in DB, springt der zeiger in die Mitte von Tabelle(biner-baum suche) und schaut was drin steht.
                          stimmt die erste Buchstabe nicht , und ihr wert grösser als gesuchter ist, dann springt der zeiger in die 1/4 von Tabelle, wenn wert kleiner als gesuchter, dann weiter in die Mitte zwischen 1/4 und 1/2.

                          z.b.s Suche von einem wert in dem Array (unser Fall 3835 Datensätze)
                          um 1 wert in Array zu finden können wir von 1 bis maximal 3835 mal unser zeiger bewegen.
                          Dasselbe könnte in DB von 1 bis maximal 13 zeigerbewegungen geschehen.
                          bei str_replace oder preg_replace mit Arrays, werden die genennte funktionen einfach dasselbe operazion 3835 mal durchführen.
                          Ausserdem wird zum Erschafung von 'such' und 'replace' arrays mindestens 150 kb von arbeitsspeicher reserviert.
                          Mit DB lösung, wird unser Text nur einmal untersucht, und schon werden der Untersuchung werden die Datensätze nach (biner-baum-suche) DB-prinzip zusammen gestellt und zum unserem REPLACE funktionen freigegeben.
                          meine Tests haben mir gezeigt, dass es in unserem fall funktioniert db etwa 2 mal schneller als includierte array.
                          damit die Andere auch testen könnten, und es ist nicht ausgeschlossen, das es bei bestimmten Bedingungen (überlastete DB-server) die Arraylösung doch schneller gehen kann, mache ich ein Anhang von funktionen als sql , als auch eine php datei zum includen.
                          Angehängte Dateien
                          Slava
                          bituniverse.com

                          Kommentar


                          • #14
                            Original geschrieben von Slava
                            damit es funktioniert, muss man kontrolieren, das vor der funktionsname[\.\s,\(] steht und (\s*\() am ende damit es nicht zur übersneidung kommt.
                            wobei am anfang auch noch "=" stehen kann, muss man mal sehen, wie man da einen guten regex hinbekommt.

                            aber du hast mich damit auf eine andere idee gebracht:

                            * preg_match_all mit o.g. regex, um alles herauszufischen, was wie eine php-funktion aussieht.

                            *in einer schleife, die potentiellen funktionen überprüfen (in_array oder besser isset - dazu muss das array noch umgebaut werden)
                            - alternative ohne array: function_exists() - obwohl, doch nicht so gut, wegen selbst definierten funktionen

                            * wenn funktion existiert, dann ein str_replace durchführen
                            am besten noch in einem tmp-array merken, welche ersetzung schon durchgeführt wurde

                            ich denke mal, das müsste schnell laufen und man muss nicht alle möglichen php-funktionen überprüfen.

                            Kommentar


                            • #15
                              Ich hab hier mal meinen Code als anhang bereitgestellt.
                              einfach die Db die Slava bereitgestellt hat nehmen und danach in meiner Datei die daten(DB Name , pw usw) eingeben und schon kann man testen

                              Ist denke ich mal nicht die beste lösung aber sie funktioniert.
                              Ich habs ja nicht so mit den REGEX darum bin ich ja froh das ich es überhaubt hinbekommen hab
                              wenn einer noch ne bessere lösung hat immer her damit

                              Danke für eure Hilfe!

                              Kommentar

                              Lädt...
                              X