muenzchen: Ist str_replace() sehr resourcenfressend?

Hallo!

Ich durchlaufe eine Schleife ca. 7000x auf einer Seite, die recht oft aufgerufen wird. In der Schelife wird bei jedem Durchlauf mit str_replace() versucht, Satzteile in einem bestimmten Text zu ersetzen.

Ist das zu aufwändig und belastet den Server sehr, oder macht das PHP nichts aus?

MfG, muenzchen

  1. Hallo muenzchen,

    Ist das zu aufwändig und belastet den Server sehr, oder macht das PHP nichts aus?

    Also sieben _tausend_ Mal sind schon heftig. Ich kenne Deine Konstruktion jetzt nicht, aber vielleicht schaust Du Dir mal folgendes an:

    $ersetzungen = array (
      'aab' => 'bbb', // aab durch bbb ersetzen
      'aac' => 'ccc', // aac durch ccc ersetzen
      //...
      'aaz' => 'zzz'  // aaz durch zzz ersetzen
    );

    $string = str_replace (array_keys ($ersetzungen), array_values ($ersetzungen), $string);

    Das macht das in einem Durchlauf. Wenn Deine Konstruktion jedoch etwas völlig anderes bezweckt, dann klappt das natürlich nicht.

    Viele Grüße,
    Christian

    --
    Hast Du einen Beitrag? Nur her damit!
    http://aktuell.de.selfhtml.org/tippstricks/beitrag.htm
    SELF-Code: (http://emmanuel.dammerer.at/selfcode.html)
    sh:) fo:) ch:] rl:( br:> n4:& ie:% mo:) va:) de:] zu:) fl:( js:| ss:) ls:[
  2. Hi!

    Ich durchlaufe eine Schleife ca. 7000x auf einer Seite, die recht oft aufgerufen wird. In der Schelife wird bei jedem Durchlauf mit str_replace() versucht, Satzteile in einem bestimmten Text zu ersetzen.

    Ist das zu aufwändig und belastet den Server sehr, oder macht das PHP nichts aus?

    Das kommt auf das Script, Deinen Server, Deinen Provider und 1000 andere Dinge an. Wieso machst Du diese 7000 Ersetzungen nicht einmalig, oder immer dann wenn sich was am Text ändert, sondern immer live?
    Wie sehr belastet das Script Deinen Server(einen Anhaltspunkt könnte folgendes liefern: http://www.dclp-faq.de/q/q-code-performance.html)

    Schreib mal etwas genauer was Du machst, am besten ein Beispiel.

    Grüße
    Andreas

    1. Nun, es ist so, dass ich Smilies in Benutzernachrichten ersetzen will. Also Code durch Bild

      Und es gibt ca. 700 Smilies in 10 Nachrichten pro Seite.

      Das muss live geschehen, damit der Benutzer die Nachricht im ursprünglichen Zustand auch wieder editieren kann.

      Wie in einem Forum.

      1. Hi!

        Und es gibt ca. 700 Smilies in 10 Nachrichten pro Seite.

        Du hast eine html-Seite mit 10 Nachrichten und jede davon enthält 700 Smilies? Scheint ja ne fröhliche Comunity zu sein ;-)

        Grüße
        Andreas

        PS: Was hast Du gegen :-) ;-)

        1. LOL, natürlich hat nicht jede Nachricht alle Smilies.

          Es müssen nur alle Möglichkeiten durchlaufen werden und falls der Code existiert muss er ersetzt werden.

          1. Hi!

            LOL, natürlich hat nicht jede Nachricht alle Smilies.

            ich dachte schon...

            Es müssen nur alle Möglichkeiten durchlaufen werden und falls der Code existiert muss er ersetzt werden.

            Verwende Christians Tipp, ist sicher das beste.

            Grüße
            Andreas

      2. Hallo muenzchen,

        Das muss live geschehen, damit der Benutzer die Nachricht im ursprünglichen Zustand auch wieder editieren kann.

        Dann nimm' doch meine Methode, die ist ideal für so etwas geeignet:

        $ersetzungen = array (
          ':-)' => '<img ...>',
          ':-(' => '<img ...>',
          ...
          ';-)' => '<img ...>'
        );

        $string = str_replace (array_keys ($ersetzungen), array_values ($ersetzungen), $string);

        Wie in einem Forum.

        Du meinst Board.

        Viele Grüße,
        Christian

        --
        Hast Du einen Beitrag? Nur her damit!
        http://aktuell.de.selfhtml.org/tippstricks/beitrag.htm
        SELF-Code: (http://emmanuel.dammerer.at/selfcode.html)
        sh:) fo:) ch:] rl:( br:> n4:& ie:% mo:) va:) de:] zu:) fl:( js:| ss:) ls:[
        1. Aber da muss ja erst recht wieder das ganze Array durchlaufen werden, oder?

          1. Hallo muenzchen,

            Aber da muss ja erst recht wieder das ganze Array durchlaufen werden, oder?

            Natürlich. Aber wenn PHP das intern in der Funktion str_replace macht, ist das viel schneller und frisst weniger Resourcen.

            Viele Grüße,
            Christian

            --
            Hast Du einen Beitrag? Nur her damit!
            http://aktuell.de.selfhtml.org/tippstricks/beitrag.htm
            SELF-Code: (http://emmanuel.dammerer.at/selfcode.html)
            sh:) fo:) ch:] rl:( br:> n4:& ie:% mo:) va:) de:] zu:) fl:( js:| ss:) ls:[
            1. Also ich habs jetzt mal so probiert. Klappt auch recht gut, nur das einzige Problem ist, dass ich array_values() nur allein ersetzen kann. Sobald ich HTML Tags drumherum schreiben will (was ich ja muss, weil ich ja einen img Tag brauche), ersetzt er alles nur mehr durch da Wort "Array".

              Warum?

              1. Hallo muenzchen,

                Also ich habs jetzt mal so probiert. Klappt auch recht gut, nur das einzige Problem ist, dass ich array_values() nur allein ersetzen kann. Sobald ich HTML Tags drumherum schreiben will (was ich ja muss, weil ich ja einen img Tag brauche), ersetzt er alles nur mehr durch da Wort "Array".

                Warum?

                Ganz einfach: Wenn Du diese Methode verwenden willst, dann müssen die Parameter, die Du da angibst, Arrays sein. Wenn Du haber etwas in der Richtung 'blabla'.array_values(...).'blabla' machst, dann wird zuerst aus allem eine Zeichenkette gemacht, die 'blablaArrayblabla' beinhaltet und _danach_ wird diese an str_replace übergeben. Entweder Du schreibst das sich wiederholende in alle Array-Einträge oder Du arbeitetest das Array einmalig vorher ab und fügst das ein:

                foreach (array_keys ($replacements) as $k) {
                  $replacements[$k] = 'blabla'.$replacements[$k].'blabla';
                }

                Viele Grüße,
                Christian

                --
                Hast Du einen Beitrag? Nur her damit!
                http://aktuell.de.selfhtml.org/tippstricks/beitrag.htm
                SELF-Code: (http://emmanuel.dammerer.at/selfcode.html)
                sh:) fo:) ch:] rl:( br:> n4:& ie:% mo:) va:) de:] zu:) fl:( js:| ss:) ls:[
                1. Hi!

                  foreach (array_keys ($replacements) as $k) {
                    $replacements[$k] = 'blabla'.$replacements[$k].'blabla';
                  }

                  Ne nette Funktion ist auch var_export(), hiermit könnt man dann $replacements einmal ausgeben, dann hat man im Browserfenster einen in PHP gültigen Array stehen, den man 1:1 in den Qulltext übernehmen kann, ist manchmal ganz praktisch, ob hier auch weiß ich nicht.

                  Grüße
                  Andreas

                  1. Hallo Andreas,

                    Ne nette Funktion ist auch var_export(),

                    Grrr. Heute ist echt nicht mein Tag. Erst sagst man mir, dass meine Funktion zum korrigieren von einem mod_rewrite-Problems unnötig ist, weil das gar kein Problem ist ([pref:t=41007&m=224462]) und jetzt erzälhst Du mir von einer Funktion, die ich selbst in PHP nachgeschrieben habe, nachdem ich keine passende gefunden habe.

                    Nichts gegen Euch, ich ärgere mich bloß über meine eigene Dummheit...

                    Viele Grüße,
                    Christian

                    --
                    Hast Du einen Beitrag? Nur her damit!
                    http://aktuell.de.selfhtml.org/tippstricks/beitrag.htm
                    SELF-Code: (http://emmanuel.dammerer.at/selfcode.html)
                    sh:) fo:) ch:] rl:( br:> n4:& ie:% mo:) va:) de:] zu:) fl:( js:| ss:) ls:[
                    1. Hi!

                      Grrr. Heute ist echt nicht mein Tag. Erst sagst man mir, dass meine Funktion zum korrigieren von einem mod_rewrite-Problems unnötig ist, weil das gar kein Problem ist ([pref:t=41007&m=224462]) und jetzt erzälhst Du mir von einer Funktion, die ich selbst in PHP nachgeschrieben habe, nachdem ich keine passende gefunden habe.

                      Nichts gegen Euch, ich ärgere mich bloß über meine eigene Dummheit...

                      was fürn Quatsch! Sei doch froh wenn Du nochmal was dazu lernst, wäre sonst doch recht langeilig ;-)

                      Wobei mir diese mod_rewrite Geschichte auch nach dem 10 lesen noch nicht wirklich klar ist, der Sinn dabei ist doch nur, dass man einem bestehnden Query-String noch weiter Informationen anhängt, oder verstehe ich das falsch? Jedenfalls würde mir das nicht viel bringen.

                      Grüße
                      Andreas

                      PS: Die Funktion gibts auch erst sein PHP 4.2, falls Dich das tröstet ;-)

                      1. Hallo Andreas,

                        Sei doch froh wenn Du nochmal was dazu lernst, wäre sonst doch recht langeilig ;-)

                        Ich habe ja nichts dagegen, dass ich was dazulerne, aber es ist in _beiden_ Fällen so ziemlich genau 3 Wochen her, dass ich mir die Arbeit gemacht habe - und ich ärgere mich, dass ich nicht _eher_ dazugelernt habe. ;-)

                        Wobei mir diese mod_rewrite Geschichte auch nach dem 10 lesen noch nicht wirklich klar ist, der Sinn dabei ist doch nur, dass man einem bestehnden Query-String noch weiter Informationen anhängt, oder verstehe ich das falsch?

                        Du hattest doch selbst einen Thread genau wegen diesem Problem gestartet: </archiv/2003/1/33840/#m184062>

                        PS: Die Funktion gibts auch erst sein PHP 4.2, falls Dich das tröstet ;-)

                        Meine PHP-Versionsanforderungen sind soeben um eine Minorversion gestiegen. ;-)

                        Viele Grüße,
                        Christian

                        --
                        Hast Du einen Beitrag? Nur her damit!
                        http://aktuell.de.selfhtml.org/tippstricks/beitrag.htm
                        SELF-Code: (http://emmanuel.dammerer.at/selfcode.html)
                        sh:) fo:) ch:] rl:( br:> n4:& ie:% mo:) va:) de:] zu:) fl:( js:| ss:) ls:[
                        1. Hi!

                          Meine PHP-Versionsanforderungen sind soeben um eine Minorversion gestiegen. ;-)

                          übrigens kann man ab PHP 4.3 auf raw POST-data zugreifen:

                          Raw POST data is now available as "php://input" stream

                          Grüße
                          Andreas

                          1. Hallo Andreas,

                            übrigens kann man ab PHP 4.3 auf raw POST-data zugreifen:

                            Danke für den Hinweis, aber ich denke, so low level möchte ich nicht programmieren. ;-)

                            Viele Grüße,
                            Christian

                            --
                            Hast Du einen Beitrag? Nur her damit!
                            http://aktuell.de.selfhtml.org/tippstricks/beitrag.htm
                            SELF-Code: (http://emmanuel.dammerer.at/selfcode.html)
                            sh:) fo:) ch:] rl:( br:> n4:& ie:% mo:) va:) de:] zu:) fl:( js:| ss:) ls:[
                            1. Hi!

                              Danke für den Hinweis, aber ich denke, so low level möchte ich nicht programmieren. ;-)

                              Ich hätte es irgendwo schonmal gebraucht, weiß aber leider nicht mehr wo ;-)

                              Grüße
                              Andreas

                              1. Moin!

                                Ich hätte es irgendwo schonmal gebraucht, weiß aber leider nicht mehr wo ;-)

                                Mehrfach-Dateiversand mit nur einem File-Feld vielleicht?

                                - Sven Rautenberg

                                --
                                Signatur oder nicht Signatur - das ist hier die Frage!
                                1. Hi!

                                  Mehrfach-Dateiversand mit nur einem File-Feld vielleicht?

                                  Wie soll das gehen? War glaube ich was mit Dateien, hatte ein Problem das PHP automatisch irgendwie nicht alles was ich wollte in $_POST geschrieben hat, oder zumindest nicht wo wie ich wollte, aber frag mich nicht was das war, scheint wohl irgendwie anders geklappt zu haben ;-)

                                  Grüße
                                  Andreas

                                  1. Moin!

                                    Mehrfach-Dateiversand mit nur einem File-Feld vielleicht?
                                    Wie soll das gehen?

                                    Wenn der Browser das mitmacht, geht das so simpel, wie es klingt: Ein <input type="file"> in die Seite, und wenn man Dateien auswählt, wählt man einfach mehr als eine aus - Strg+Datei z.B., wie man eben mehrere Dateien auswählt.

                                    Das POST-Datenformat gibt das auf jeden Fall her. "multipart/form-data" erlaubt es, Dateien zu verschicken - und es ist auch möglich, in einem Multipart-Abschnitt weitere Unterabschnitte zu schachteln und so mehrere Dateien zu verschicken. Leider versteht PHP das nicht. Für ASP hätte ich auch nicht besonders viel Hoffnung. Vielleicht versteht ein Perl-Modul das. Allerdings erlauben nicht besonders viele Browser die Mehrfachauswahl. Mit Opera gehts. :)

                                    - Sven Rautenberg

                                    --
                                    Signatur oder nicht Signatur - das ist hier die Frage!
                                    1. Hallo

                                      Sach ma' Sven, die Fotos in deiner Signatur,
                                      soll daraus über die Jahre ein Bilderrätsel
                                      für unsereiner werden? Oder ist das doch nur
                                      eine Art von Kalender?

                                      Im letzten Jahr bis in den Herbst hinein die "Sommerpause",
                                      dann der "Selfbackwahn/waren", hernach ein "Auftauen" und
                                      nunmehr ein Stückchen eines Walmdaches.
                                      Was wird uns noch erwarten? :-)

                                      Tschö, Auge

                                      1. Moin!

                                        Sach ma' Sven, die Fotos in deiner Signatur,
                                        soll daraus über die Jahre ein Bilderrätsel
                                        für unsereiner werden? Oder ist das doch nur
                                        eine Art von Kalender?

                                        Im letzten Jahr bis in den Herbst hinein die "Sommerpause",
                                        dann der "Selfbackwahn/waren", hernach ein "Auftauen" und
                                        nunmehr ein Stückchen eines Walmdaches.
                                        Was wird uns noch erwarten? :-)

                                        Erstmal: Freut mich, dass es auffällt. :)

                                        Aber nein: Das ist kein Kalender, auch kein Bilderrätsel. Was die echten, realen Bilder angeht, sind das lediglich ein paar Auszüge aus dem, was ich mit meiner schon nicht mehr ganz so neuen Digitalkamera so produziere. Andere haben kleine rosa Seitenschweine (und immer dieselben) - bei mir gibts eben etwas Abwechslung. :)

                                        - Sven Rautenberg

                                        --
                                        Signatur oder nicht Signatur - das ist hier die Frage!
                        2. Hi Christian!

                          Wobei mir diese mod_rewrite Geschichte auch nach dem 10 lesen noch nicht wirklich klar ist, der Sinn dabei ist doch nur, dass man einem bestehnden Query-String noch weiter Informationen anhängt, oder verstehe ich das falsch?

                          Du hattest doch selbst einen Thread genau wegen diesem Problem gestartet: </archiv/2003/1/33840/#m184062>

                          Ja - aber löse ich damit das Problem? Wie ich verstehe macht dieser Modus folgendes:

                          Request  /tolle_seite.html
                          wird umgeleitet nach     /tolle_seite.html?meintollerparameter=%wasauch immer

                          Naja, würde keinen Sinn ergeben, verstehe das ganze irgendwie nicht. Was ist jetzt daran so toll das Du Dich so aufregst?

                          Grüße
                          Andreas

                          1. Hallo Andreas,

                            Ja - aber löse ich damit das Problem? Wie ich verstehe macht dieser Modus folgendes:

                            Request  /tolle_seite.html
                            wird umgeleitet nach     /tolle_seite.html?meintollerparameter=%wasauch immer

                            Nein. Ich habe es bereits getestet:

                            Fall 1:

                            RewriteCond %{REQUEST_URI}  !^/index.php.*
                            RewriteRule ^(.*)$                      index.php?url=$1          [L]

                            Es passiert folgendes:

                            /hallo         => /index.php?url=hallo
                            /hallo?q=a     => /index.php?url=hallo

                            Fall 2:

                            RewriteCond %{REQUEST_URI}  !^/index.php.*
                            RewriteRule ^(.*)$                      index.php?url=$1          [L,QSA]

                            /hallo         => /index.php?url=hallo
                            /hallo?q=a     => /index.php?url=hallo&q=a

                            Dann brauche ich meine Funktion gar nicht, die die Querystring-Paramter wiederherstellt.

                            Viele Grüße,
                            Christian

                            --
                            Hast Du einen Beitrag? Nur her damit!
                            http://aktuell.de.selfhtml.org/tippstricks/beitrag.htm
                            SELF-Code: (http://emmanuel.dammerer.at/selfcode.html)
                            sh:) fo:) ch:] rl:( br:> n4:& ie:% mo:) va:) de:] zu:) fl:( js:| ss:) ls:[
                            1. Hi Christian!

                              Jetzt wo Du es schreibst, klingt logisch ;-)

                              /hallo?q=a     => /index.php?url=hallo&q=a

                              perfekt, das kann ich ebenfalls gut gebrauchen - wie Du bereits sagtest ;-)

                              Aber ein ganz anderes Problem. Obige Lösung ist ein sehr guter Weg um GET-Parameter an das richtige Script zu übermitteln, das hab eich zwar auch geschafft aber nicht wirklich so elegant ;-)

                              Problematischer(oder auch nicht?) sind aber IMHO POST Parameter. Wenn ich ebenso wie im beispiel oben ein Formmukar per POST an "hallo" schicke mit den Parametern "q=a", dann funktioniert ja die Rewrite-Geschichte nicht mehr.

                              Ich habe die Erfahrung gemacht, dass bei einem Rewrite die POST-Parameter dem Scipt index.php ganz normal zur Verfügung($_POST["q"]="a") stehen, als sei der Request direkt an dieses Script gegangen. Ich habe allerdings ein schlechtes Gefühl bei der Sache, da ich nicht wirklich verstehe wie das funktioniert. POST geht ja an STDIN von PHP, PHP schreibt das dann in $_POST, und/oder $_FILES.

                              Nur funktioniert das so 100%ig? Denn es ist für PHP durchaus ein Unterschied ob das Script direkt oder über Rewrite angesprochen wurde, denn hierbei ändert sich was an den headern, oder eben nicht, auf alle Fälle kann ich im Script index.php auf den alten Request zugreifen, ich sehe in einer der Umgebungsvariablen das der Request an "hallo?q=a" ging, damals habe ich mir aus dieser Variable die alten Parameter extrahiert. Es dürfte Seitens des Apachen sichergestellt sein das nicht verschiedene Requests durcheinander kommen, das stdin bezieht sich immer auf einen Prozess, der dann an einen bestimmten Client antwortet. Im prinzip ist der Aufruf von index.php nach mod_rewrite ja schon sowas wie ein direkter HTTP-Aufruf, so dass ich eigentlich glaube dass ich immer die POST-Daten in $_POST haben werde, aber ich bin mir halt nicht sicher.

                              Könnte sich jemand von Euch Konstellationen vorstellen, in denen es Probleme geben könnte?

                              Grüße
                              Andreas

                              1. Moin!

                                Problematischer(oder auch nicht?) sind aber IMHO POST Parameter. Wenn ich ebenso wie im beispiel oben ein Formmukar per POST an "hallo" schicke mit den Parametern "q=a", dann funktioniert ja die Rewrite-Geschichte nicht mehr.

                                Wenn du POSTest, kannst du trotzdem mit ?-Parametern arbeiten, die von PHP logischerweise als $_GET ausgewertet werden.

                                Ich habe die Erfahrung gemacht, dass bei einem Rewrite die POST-Parameter dem Scipt index.php ganz normal zur Verfügung($_POST["q"]="a") stehen, als sei der Request direkt an dieses Script gegangen. Ich habe allerdings ein schlechtes Gefühl bei der Sache, da ich nicht wirklich verstehe wie das funktioniert. POST geht ja an STDIN von PHP, PHP schreibt das dann in $_POST, und/oder $_FILES.

                                Nein, ein schlechtes Gefühl ist vollkommen unnötig. Rewriting bastelt aus der von außen angefragten URL eine intern gültige URL, an die der Request dann gerichtet wird. Das ist eine Umsetzung, die ganz zu Beginn erledigt wird, lange bevor PHP ins Spiel kommt. Naja, "lange" bei .htaccess-Rewriting vielleicht nicht unbedingt, aber auf jeden Fall "vorher".

                                Sofern du das Rewriting nicht veranlaßt, einen Redirect auszugeben, halte ich diese Vorgehensweise für sicher und verläßlich.

                                - Sven Rautenberg

                                --
                                Signatur oder nicht Signatur - das ist hier die Frage!
                                1. Hi Sven!

                                  Wenn du POSTest, kannst du trotzdem mit ?-Parametern arbeiten, die von PHP logischerweise als $_GET ausgewertet werden.

                                  Ich meinte mit Parameter in Zusammenhang mit POST Formulareinträge.

                                  Nein, ein schlechtes Gefühl ist vollkommen unnötig.

                                  sehr beruhigend wenn Du das sagst ;-)

                                  Rewriting bastelt aus der von außen angefragten URL eine intern gültige URL, an die der Request dann gerichtet wird.

                                  Also:

                                  in / liegt eine .htaccess mit folgender Rewrite Rule:
                                  RewriteRule ^(.*)$              index.php?url=$1          [QSA]

                                  Browser sendet HTTP-Request(POST) an /hallo.html

                                  Apache empfängt Request auf Port 80, und analysiert den Request.

                                  -> korrekter Virtual-Host wird bestimmt
                                     -> korrekter doc-Root im Filesytem erkannt
                                     -> .htaccess wird geladen

                                  -> und Request String "POST /hallo.html HTTP/1.1" wird analysiert
                                    -> laut .htaccess wird jetzt /hallo.html nach /index.php?url=hallo.html übersetzt
                                    -> neuer Request wird analysiert,
                                       -> index.php wird als PHP erkannt,
                                       -> es wird PHP gestartet und
                                       -> gemäß der Schnittstelle werden alle Daten (sowohl umgebungsvarianlen/Header als auch POST-Daten) an den PHP oder Apache-prozess übergeben.

                                  habe ich das so zumindest an der enzscheidenen Stelle richtig wiedergegeben? Also erst wenn wirklich der endgültige Request ermittelt ist werden die Daten alle zusammen mit den POST-Daten an PHP übergeben. Ist eigentlich auch das vernünftigste.

                                  Sofern du das Rewriting nicht veranlaßt, einen Redirect auszugeben, halte ich diese Vorgehensweise für sicher und verläßlich.

                                  ich mache das genau so wie Christian das geschreiben hat:

                                  RewriteRule ^(.*)$                      index.php?url=$1          [L,QSA]

                                  Sollte also keine Probleme geben.

                                  Danke für die Klarstellung.

                                  Grüße
                                  Andreas