php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 09-05-2007, 22:49
tontechniker
 PHP Senior
Links : Onlinestatus : tontechniker ist offline
Registriert seit: Jul 2005
Beiträge: 1.972
tontechniker ist zur Zeit noch ein unbeschriebenes Blatt
Standard 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?
__________________
Die Regeln | rtfm | register_globals | strings | SQL-Injections | []

Geändert von tontechniker (09-05-2007 um 23:01 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 10-05-2007, 08:42
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard Re: Schnellste Implementation von __autoload ( )

Zitat:
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.
Mit Zitat antworten
  #3 (permalink)  
Alt 10-05-2007, 08:52
closure
 Master
Links : Onlinestatus : closure ist offline
Registriert seit: Mar 2006
Beiträge: 796
closure ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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!")
Mit Zitat antworten
  #4 (permalink)  
Alt 10-05-2007, 09:12
axo
 Junior Member
Links : Onlinestatus : axo ist offline
Registriert seit: Jan 2006
Ort: 127.0.0.1
Beiträge: 196
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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

Geändert von axo (10-05-2007 um 09:16 Uhr)
Mit Zitat antworten
  #5 (permalink)  
Alt 10-05-2007, 11:51
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
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

Geändert von ghostgambler (10-05-2007 um 11:57 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 10-05-2007, 20:20
tontechniker
 PHP Senior
Links : Onlinestatus : tontechniker ist offline
Registriert seit: Jul 2005
Beiträge: 1.972
tontechniker ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
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.
Zitat:
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 | []
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:35 Uhr.