Schnellste Implementation von __autoload ( )

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

  • Schnellste Implementation von __autoload ( )

    Ich habe verschiedene Überlegungen angestellt wie man __autoload ( ) implementieren könnte. Die Klasse / Funktion kann höchstens bei Libary Klassen wissen ob die Datei existiert, die anderen Dateien werden vom Programmierer angelegt.
    Bisher war die Funktion wie folgt aufgebaut (PATH verweist auf das absolute Verzeichnis):
    PHP-Code:
    function __autoload $class ) {
       
    $classPath str_replace '_''/'$class );
       if ( 
    file_exists PATH 'Libary/' $classPath '.php' ) ) {
          include ( 
    PATH 'Libary/' $classPath '.php' );
       } elseif ( 
    file_existsPATH 'Application/' $classPath '.php' ) ) {
          ... 
    // vier mögliche Pfade
       
    }

    Die SPL-Klasse ermöglicht es aber auch Funktionen aus Klassen als autoload-Handler zu definieren. Darüber wäre es möglich auch ohne global Werte zu speichern (und darüber hinaus auch besser im Framework verwendbar.)
    Die Frage wie der Vorgang am schnellsten ablaufen kann (Da die Funktion bei jedem new ... aufgerufen wird ist das wiederholte Ausführen von file_exists nicht unbedingt performant.
    Möglichkeiten wären
    • zu speichern ob eine Datei existiert / nicht existiert (da es normalerweise nicht mehr als einen Aufruf von einer Klasse gibt nicht umbedingt sinnvoll)
    • Eine Liste mit allen Dateien zu erstellen (in den möglichen Pfaden) - die Frage ist wie man mit Klassen wie Model_Blog umgeht (Verzeichnis: Application/Model/Blog.php)
    • EDIT:
      für alle Verzeichnisse einen Handler zu registrieren und spl_autoload_call alle durchlaufen lassen.
      PHP-Code:
       public function __autoloadController $controller ) {
         try {
            include ( .... );
         }

      oder so

    - hat jemand eine bessere Idee oder eine schnellere Implementation?
    Zuletzt geändert von tontechniker; 09.05.2007, 23:01.
    Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

  • #2
    Re: Schnellste Implementation von __autoload ( )

    Original geschrieben von tontechniker
    Da die Funktion bei jedem new ... aufgerufen wird ist das wiederholte Ausführen von file_exists nicht unbedingt performant.
    Die muss nicht bei jedem new ... aufgerufen werden - sondern nur bei denen, bei denen die Klasse noch nicht geladen wurde.
    Ab der zweiten Instanz eines Objektes, die du erstellst, ist weder ein Aufruf von __autoload, noch ein file_exists nötig.

    Und "wiederholtes Ausführen von file_exists" für eine bestimmte Datei ist in einer Scriptinstanz m.E. auch nicht sonderlich unperformant - schliesslich werden die Ergebnisse gecached.

    (correct me if i'm wrong ...)
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Hi,

      imho ist das geteste ob eine datei existiert sinnlos.
      Wenn die datei nicht gefunden werden kann bekommst du eine
      fehlermeldung. Das ist das was man will. Dann weisst du dass
      dein autoload irgendwas nicht hinbekommt.

      Dann noch die möglichen pfade in den include_path tun und dein
      autoload reduziert sich auf das umschreiben des klasssennamens
      in einen pfad.

      greets
      (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

      Kommentar


      • #4
        das, was wirklich performance bringt (jedenfalls für php-versionen unter 5.2, darüber habe ich noch keine benchmarks) ist, den include-path so klein wie möglich halten. gerade require_once() läuft (trotz _once!!!) jedes einzelne mal den include_path durch und schaut für jedes verzeichnis ob das file da ist.
        das wirklich performanteste ist
        * ein einziger pfad im include_path
        * keine bedingungen in __autoload()

        (evtl. könnte man natürlich versuchen, alle files aus dem include_path ins ramFS zu legen, dann ist eh alles wurscht )

        aber dann is auch gut - es gibt weit wichtigere sachen, die zu optimieren sind.

        ich nehme an, das hier ist bekannt:
        http://ez.no/content/download/134087...omance_php.pdf

        grüße
        axo
        Zuletzt geändert von axo; 10.05.2007, 09:16.

        Kommentar


        • #5
          Original geschrieben von axo
          das, was wirklich performance bringt (jedenfalls für php-versionen unter 5.2, darüber habe ich noch keine benchmarks) ist, den include-path so klein wie möglich halten. gerade require_once() läuft (trotz _once!!!) jedes einzelne mal den include_path durch und schaut für jedes verzeichnis ob das file da ist.
          das wirklich performanteste ist
          * ein einziger pfad im include_path
          * keine bedingungen in __autoload()
          Klassen sind auch fürchterlicher Overhead, trotzdem verzichtet niemand darauf...

          Ab 5.2 gibt es für jede Datei nur noch ein stat-Aufruf und seine Pfade sollte man immer absolut angeben, wer halt einfach ein include("test.php") macht (was ja der einzige Grund ist für include_paths) ist selbst schuld ^^,


          @pdf
          Da sind viele Dinge bei, die einen einfach nicht zu interessieren haben ... ob ein implode(',', $_SERVER) jetzt schneller oder langsamer als ein implode(',', array_values($_SERVER)) ist, interessiert doch niemanden ... in diesem Fall geht es einfach darum, dass jeder den Code möglichst schnell versteht - zumal auch im PDF schon deutlich wurde, dass die Zeitunterschiede auch mit den verschiedenen Versionen unterschiedlich sind... mMn sollte man lieber auf korrekte Syntax achten; wem php zu langsam ist soll lieber direkt mit am Core helfen und verbessern, als durch Rumgetrickste im php zu versuchen diese "Fehler" im C-Code zu kompensieren
          Zuletzt geändert von ghostgambler; 10.05.2007, 11:57.

          Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

          bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
          Wie man Fragen richtig stellt

          Kommentar


          • #6
            Die muss nicht bei jedem new ... aufgerufen werden - sondern nur bei denen, bei denen die Klasse noch nicht geladen wurde.
            Richtig. Da bringt der Cache aber auch nichts da die Namen ja nicht doppelt auftreten.
            imho ist das geteste ob eine datei existiert sinnlos.
            Nicht unbedingt. Wie axo schon sagt ist der include_path nicht das schnellste.

            Ich werd mal ein bisschen testen, das schnellste wird wohl ein Handler sein (bei mehreren geht PHP die Handler einzeln durch).
            Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

            Kommentar

            Lädt...
            X