Bolle: Php Funktionen

Hallo,

ich hab mal eine dümmliche Frage: ich würde mir gerne mal bestimmte PHP-Funktionen ansehen (Aufbau etc) zb. nl2br()

Wo finde ich die denn oder hat man da gar keinen Zugriff drauf?

Viele Grüße

Bolle

  1. Moin!

    ich hab mal eine dümmliche Frage: ich würde mir gerne mal bestimmte PHP-Funktionen ansehen (Aufbau etc) zb. nl2br()

    Wo finde ich die denn oder hat man da gar keinen Zugriff drauf?

    Wenn du C kannst: Der Quelltext von PHP ist öffentlich. Ich weise aber deutlich darauf hin, dass dieser Quelltext absolut nichts mit PHP gemeinsam hat, du siehst also nicht die interne Arbeitsweise von nl2br() aufgeschlüsselt in PHP-Code.

    - Sven Rautenberg

    1. Hallo Sven,

      Wenn du C kannst: Der Quelltext von PHP ist öffentlich. Ich weise aber deutlich darauf hin, dass dieser Quelltext absolut nichts mit PHP gemeinsam hat, du siehst also nicht die interne Arbeitsweise von nl2br() aufgeschlüsselt in PHP-Code.

      danke für die Info. Mal dumm gefragt: ist beispielsweise die php-eigene Funktion nl2br() schneller (da in C geschrieben) als eine, die in PHP mit der gleichen Funktionalität nachgebaut wurde?

      Gruss

      1. Hallo Bolle!

        Mal dumm gefragt: ist beispielsweise die php-eigene Funktion nl2br() schneller (da in C geschrieben) als eine, die in PHP mit der gleichen Funktionalität nachgebaut wurde?

        Das dürfte wohl so sein, weil du nicht drumrum kommen wirst weitere Funktionen in deinem eigenen Konstrukt aufzurufen.
        Oder, mal noch dümmer gefragt, könnte man dieselbe Geschwindigkeit erreichen?

        LG

        1. Hallo Michael

          Das dürfte wohl so sein, weil du nicht drumrum kommen wirst weitere Funktionen in deinem eigenen Konstrukt aufzurufen.
          Oder, mal noch dümmer gefragt, könnte man dieselbe Geschwindigkeit erreichen?

          Das wäre mal ein Test wert....

          Gruss

          1. Guten Tag,

            Das wäre mal ein Test wert....

            Überraschenderweise war str_replace() minimal schneller als nl2br() (bei gleichem Funktionsumfang):

            ----------------------------------------------------------
            marker        time index            ex time         perct
            ----------------------------------------------------------
            Start         1248024924.58426400   -                0.00%
            ----------------------------------------------------------
            End nl2br()   1248024933.24032300   8.656059        51.38%
            ----------------------------------------------------------
            Stop          1248024941.42981600   8.189493        48.62%
            ----------------------------------------------------------
            total         -                     16.845552      100.00%
            ----------------------------------------------------------

            Ergibt 51.38% für nl2br(), 48.62% für str_replace().

            Skripte - benötigt PEAR/Benchmark.

            Gruß
            Christoph Jeschke

            --
            Zend Certified Engineer
            Certified Urchin Admin
            1. Guten Tag,

              Das wäre mal ein Test wert....

              Überraschenderweise war str_replace() minimal schneller als nl2br() (bei gleichem Funktionsumfang):

              Wow, das hätte ich auch nicht erwartet. Also alle nl2br() ersetzten ;)
              Wie verhält es sich mit:

              function my_nl2br(){  
                  str_replace(...);  
                  ...  
              }
              

              ?

              LG

            2. Hi!

              Überraschenderweise war str_replace() minimal schneller als nl2br() (bei gleichem Funktionsumfang):

              Du misst Mist. Zum einen ist der Funktionsumfang

              str_replace(array("\r\n", "\n\r", "\r", "\n"), array("<br />\r\n", "<br />\n\r", "<br />\r", "<br />\n"), $text)

              und nicht wie bei dir nur

              str_replace(array("\n", "\r"), "<br />\n", $text)

              Es werden die Zeilenenden-Kombinationen berücksichtigt. Außerdem bleiben sie erhalten und werden nicht pauschal durch \n ausgetauscht. Mit der Langversion komme ich auf weiter auseinanderliegende Werte zugunsten von nl2br(). Mit welcher PHP-Version hast du gemessen? Der Funktionsumfang wurde mit Version 5.3 um den Parameter is_xhtml erweitert. Es kommt also auch noch mindestens eine Verzweigung dazu.

              Zudem misst du nur die Laufzeit des Codes und berücksichtigst nicht die Parsezeit. Und selbst wenn es Unterschiede zwischen beiden Varianten gibt, sind diese so minimal, dass sie im praktischen Einsatz nicht ins Gewicht fallen. Schwerwiegender ist, dass du jedes Mal deutlich mehr notieren musst als ein "nl2br()". Wenn du eine Funktion dafür schreibst, wirst du deren Parse- und Ausführungszeit hinzubekommen und möglicherweise auch noch ein include. Alles in allem sehe ich mehr Nachteile, auf nl2br() zu verzichten, als die (angeblichen) Mikrosekunden Gewinn.

              Im Gegensatz zu reinen Code-Teil-Laufzeiten, die mit microtime() gemessen werden, berücksichtigen Tools wie Apaches "ab" oder "ab2" den kompletten Request-Response-Zyklus. Der Unterschied ist der zwischen einer Labormessung und einer im tatsächlichen Einsatz.

              Lo!

              1. ... und ausserdem ist "str_replace" auf Grund seiner "Eigenart" im bereits Ersetztem zu ersetzen grundsätzlich dafür ungeeigent.

                Schonmal das Ergebnis angeschaut?!

                1. PS: wenn "nl2br" ersetzt werden soll, was durchaus Sinn machen kann, dann:

                    
                  define('LF', 0x0A);  
                  define('CR', 0x0D);  
                  define('BR', nl2br(LF)); // oder nl2br(PHP_EOL) - Server spezifisch  
                  $text = strtr($text, array(CR.LF => BR, LF.CR => BR, CR => BR, LF => BR));  
                  
                  
                  1. Hello,

                    PS: wenn "nl2br" ersetzt werden soll, was durchaus Sinn machen kann, dann:

                    define('LF', 0x0A);
                    define('CR', 0x0D);
                    define('BR', nl2br(LF)); // oder nl2br(PHP_EOL) - Server spezifisch
                    $text = strtr($text, array(CR.LF => BR, LF.CR => BR, CR => BR, LF => BR));

                    Das sehe ich noch nicht.
                    String-Translate ist eine byteorientierte Ersetzungsfunktion, die das Vorkommen eines Bytewertes im Eingangsstring gegen den Wert aus dem Ersetzungsstring des Index, der aus dem Suchstring ermittelt wird, ersetzt.

                    Einfacher ausgedrückt:
                    Nehme Bytewert aus Eingangsstring
                    suche Bytewert in Suchstring und ermittele Index
                    nehme Bytewert an der Stelle Index aus dem Ersetzungsstring und klatsche
                          in an die untersuchte Stelle des Ergebnisstring.

                    Liebe Grüße aus dem schönen Oberharz

                    Tom vom Berg

                    --
                    Nur selber lernen macht schlau
                    http://bergpost.annerschbarrich.de
                    1. Hi!

                      String-Translate ist eine byteorientierte Ersetzungsfunktion, die das Vorkommen eines Bytewertes im Eingangsstring gegen den Wert aus dem Ersetzungsstring des Index, der aus dem Suchstring ermittelt wird, ersetzt.

                      Von strtr() gibt es zwei Aufrufvarianten. Du beschreibst die erste, sichwunderer verwendete die zweite.

                      Lo!

                  2. Moin!

                    PS: wenn "nl2br" ersetzt werden soll, was durchaus Sinn machen kann, dann:

                    define('LF', 0x0A);
                    define('CR', 0x0D);
                    define('BR', nl2br(LF)); // oder nl2br(PHP_EOL) - Server spezifisch
                    $text = strtr($text, array(CR.LF => BR, LF.CR => BR, CR => BR, LF => BR));

                      
                    Du definierst hier drei Konstanten, die ich mal eher als überflüssig bezeichnen würde, die aber Zeit kosten. Wenn überhaupt, würde ich das Array zentral definieren (geht natürlich nicht als Konstante), oder als Funktion.  
                      
                    Also im Zweifel sowas:  
                    ~~~php
                      
                    $text = strtr($text, array("\r\n" => "<br />\n", "\n\r" => "<br />\n", "\r" => "<br />\n", "\n" => "<br />\n"));  
                    
                    

                    Andererseits kann ich mir gerade nicht so ganz vorstellen, welches Szenario eintreffen muss, damit man Zeilenenden server-systemspezifisch behandeln will - weil die Zeilenenden sich doch üblicherweise erst auf dem Client auswirken, und alle Browser die möglichen Kombinationen als "Whitespace in HTML" behandeln.

                    - Sven Rautenberg

                    1. N'abend

                      Wie Du was implementierst ist (mir) im Prinzip egal, hier ging es ja in erster Linie um "str_replace" und dessen Besonderheiten.
                      Das "strtr" war die aufgezeigte Alternative, die Konstanten, die im übrigen bis auf die letzte FALSCH sind (sollte chr(nummer) lauten), dienen hier eher der Übersicht.
                      Ob für diese Werte Konstanten sindvoll sind oder nicht, hängt  IMHO davon ab wie oft man selbige benötigt.

                      Ein Serverspez. EOL könnte Sinn machen wenn das Ergebnis noch in irgendeiner Verarbeitungsschleife landen soll in der entsprechende Zeilenenden gefordert werden.

                    2. Hallo

                      $text = strtr($text, array("\r\n" => "<br />\n", "\n\r" => "<br />\n", "\r" => "<br />\n", "\n" => "<br />\n"));

                        
                      Was sich hier schon zum wiederholten Male in diesem Thread zeigt, sich sozusagen durchschleppt, ist "\n\r" bzw. "LF.CR" als ein möglicher Zeilenumbruch. Bin ich vielleicht neben der Spur? Das gibt es doch eigentlich garnicht oder sollte ich mich so irren?  
                        
                      Tschö, Auge  
                      
                      -- 
                      Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.  
                      Terry Pratchett, "Wachen! Wachen!"  
                        
                      [Veranstaltungsdatenbank Vdb 0.3](http://termindbase.auge8472.de/)
                      
                      1. Hello,

                        $text = strtr($text, array("\r\n" => "<br />\n", "\n\r" => "<br />\n", "\r" => "<br />\n", "\n" => "<br />\n"));

                        Was sich hier schon zum wiederholten Male in diesem Thread zeigt, sich sozusagen durchschleppt, ist "\n\r" bzw. "LF.CR" als ein möglicher Zeilenumbruch. Bin ich vielleicht neben der Spur? Das gibt es doch eigentlich garnicht oder sollte ich mich so irren?

                        Nö, der ist ungültig und sollte auch nirgendwo auftraten.

                        Wenn es um Zeilenumbrüche üner HTTP (aus dem Browser), z.B. aus einer Textarea, geht, dann sollte auch nur "\r\n" auftreten, egal auf welchem System der Browser läuft. Wenn ein Request nur "\r" oder nr "\n" liefert, sollte der Browser auf jeden Fall diese Umbrüche als "\r\n" zurückliefern, also immer ergänzen.

                        Liebe Grüße aus dem schönen Oberharz

                        Tom vom Berg

                        --
                        Nur selber lernen macht schlau
                        http://bergpost.annerschbarrich.de
                      2. Hi!

                        Was sich hier schon zum wiederholten Male in diesem Thread zeigt, sich sozusagen durchschleppt, ist "\n\r" bzw. "LF.CR" als ein möglicher Zeilenumbruch. Bin ich vielleicht neben der Spur? Das gibt es doch eigentlich garnicht oder sollte ich mich so irren?

                        Es geht darum, das Verhalten von nl2br() nachzubilden. Und diese Funktion berücksichtigt nun mal auch \n\r.

                        Lo!

                        1. Hello,

                          Es geht darum, das Verhalten von nl2br() nachzubilden. Und diese Funktion berücksichtigt nun mal auch \n\r.

                          Ist ja schrecklich ;-P

                          Liebe Grüße aus dem schönen Oberharz

                          Tom vom Berg

                          --
                          Nur selber lernen macht schlau
                          http://bergpost.annerschbarrich.de
                2. Hello,

                  ... und ausserdem ist "str_replace" auf Grund seiner "Eigenart" im bereits Ersetztem zu ersetzen grundsätzlich dafür ungeeigent.

                  Das dürfte hier sinngemäß zutreffen.
                  str_(i)replace führt die Ersetzungen des Search-Arrays sauber nacheinader durch. Es nimmt also den Originaltext und ersetzt das Gesuchte, nimmt diesen Ergebnistext un ersetzt das nächste gesuchte Element.

                  Wenn man nun Elemente einsetzt, die in nachfolgenden Elementen des Such-Arrays noch auftreten, dann werden die logischerweise auch wieder ersetzt.

                  Da hier erst ein "\r\n" gesucht wird, das orendlicherweise durch ein "<br>\r\n" ersetzt werden muss,  oder bei xhtml durch ein "<br />\r\n", kann man anschließend nicht noch nach einem losen "\r" oder einem "\n" suchen, das würde dann nämlich auch die Vorkommen von "<br>\r\n" finden und betreffen.

                  Man müsste also z.B.

                  $text = str_replace(array("\r\n","\r","\n"), chr(30));
                    $text = str_replace(chr(30), "<br>\r\n");
                  oder
                    $text = str_replace(chr(30), "<br />\r\n");

                  schreiben, um das Gewünschte zu erreichen.
                  Vorher müsste der Ordnung halber noch geprüft werden, dass chr(30) (RS = Record Separator) im Text noch nicht erhalten ist.

                  Es kann selbstverständlich auch ein anderes Zwischenzeichen verwendet werden...

                  Liebe Grüße aus dem schönen Oberharz

                  Tom vom Berg

                  --
                  Nur selber lernen macht schlau
                  http://bergpost.annerschbarrich.de
                  1. Hello,

                    Man müsste also z.B.

                    $text = str_replace(array("\r\n","\r","\n"), chr(30), $text);
                        $text = str_replace(chr(30), "<br>\r\n", $text);

                    oder

                    $text = str_replace(chr(30), "<br />\r\n", $text);

                    schreiben, um das Gewünschte zu erreichen.

                    aber diesen Fehler hättet Ihr ja sicher selber fixen können :-))

                    Liebe Grüße aus dem schönen Oberharz

                    Tom vom Berg

                    --
                    Nur selber lernen macht schlau
                    http://bergpost.annerschbarrich.de
                3. Hi!

                  ... und ausserdem ist "str_replace" auf Grund seiner "Eigenart" im bereits Ersetztem zu ersetzen grundsätzlich dafür ungeeigent.
                  Schonmal das Ergebnis angeschaut?!

                  Nein, zugegebenermaßen hab ich mir das geschenkt. Da die ganze Aktion in meinen Augen nicht sehr sinnvoll war und an der Ausführung Mängel waren, war ich daran nicht wirklich interessiert. Wie auch immer, statt str_replace() wäre jedoch das von dir im Nachtrag erwähnte strtr() in der zweiten Variante besser geeignet, dann sollte es aber auch richtig angewendet werden und nicht wie ebenfalls bei dir zu sehen, die Zeilenenden verändern.

                  Lo!

              2. Guten Tag,

                Alles in allem sehe ich mehr Nachteile, auf nl2br() zu verzichten, als die (angeblichen) Mikrosekunden Gewinn.

                Ich habe da keine Empfehlung abgegeben. Ich halte diese Art von Optimierung eh für sinnlos (Frei nach dem Don: Premature optimization is the root of all evil) - wie oft bearbeitet man wohl 10000 mal den gleichen Text in einer Schleife?

                Da sieht man mal wieder, wie subjektiv die Wahrnehmung ist. Ich dachte mir: Pah, so ein paar Mikrosekunden in einem sinnlosen Szenario und der Vorposter macht daraus gleich eine Revolution.

                Gruß
                Christoph Jeschke

                --
                Zend Certified Engineer
                Certified Urchin Admin
                Selfcode: sh:( fo:) ch:? rl:? br:& n4:( ie:( mo:) va:} de:] zu:$ fl:( ss:} ls:& ja:|