• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Performance Problem beim Include

ky_fr34k

Mitglied
Hallo zusammen,

ich hab folgendes Problem.
Auf meinem Webspace läuft mein eigenes CMS.
Leider braucht es zum includen meiner Plugins (21 Stück, jedes mit 3 Files) ca 50% der Zeit. Das ist auf meinem Test Server noch ok, aber produktiv unter Last dauert das ca 8-10 mal länger.

Ich hab mal einen Screenshot mit einer Zeitauswertung angehängt.Unbenannt.jpg
Das Problem ist "ComponentTypes->GetAll" ist eigentlich nur eine foreach mit einem include_once.

Hab schon folgendes probiert was eine minimale Verbesserung gebracht hat.
PHP:
foreach($pluginList as &$plugin)
{
    if(file_exists($plugin['path']) && !class_exists($plugin['class'], false))
        include $plugin['path'];
}
Hat jemand eine Idee, was ich falsch mache, was ich besser machen könnte?

Gruß KY
 
Werbung:
Ich kann mir auch nicht vorstellen, dass das Stückchen (unter "normalen" Bedingungen) 300 ms brauchen soll. Die explizite Referenz da kannst du dir übrigens schenken, PHP läuft mit "copy on write" und kopiert nur, wenn geschrieben wird. Das heißt, da würde so oder so nur eine Referenz erzeugt.

Sagt dir Autoloading was? Wäre vielleicht einen Blick wert, auch wenn es essentiell wohl dasselbe ist. Kann es leider gerade aus Zeitgründen nicht ausformulieren.
 
Werbung:
Ich kann mir auch nicht vorstellen, dass das Stückchen (unter "normalen" Bedingungen) 300 ms brauchen soll.
Hier mal die komplette Function die ganz genau einmal aufgerufen wird.
PHP:
public static function GetAll()
{
foreach($rawList as &$rawItem)
{
    self::$types[$rawItem["class"]] = $rawItem;
    if($rawItem["visible"] == 1)
        self::$visibleTypes[$rawItem["class"]] = $rawItem;
    
    if(file_exists($rawItem["path"]))
        include_once $rawItem["path"];
    else
        Debug::AddLine("Warning: Can't include file \"".$rawItem["path"]."\". File not exists.");
}
}
Die explizite Referenz da kannst du dir übrigens schenken, PHP läuft mit "copy on write" und kopiert nur, wenn geschrieben wird. Das heißt, da würde so oder so nur eine Referenz erzeugt.
Danke, wieder was gelernt.
Sagt dir Autoloading was? Wäre vielleicht einen Blick wert, auch wenn es essentiell wohl dasselbe ist. Kann es leider gerade aus Zeitgründen nicht ausformulieren.

Vielleicht willst du Klassen erst mittels eines Autoloaders laden, wenn sie gebraucht werden?

Autoloading hört sich gut an ich schaus mir mal an.
Edit: Autoloading hast das Problem zwar nicht beseitigt, aber dadurch dass jetzt nicht mehr alle Plugins geladen werden müssen ist die Zeit in einem aktzeptablen Bereich.

Edit: Ich hab rausgefunden das rund die Hälfte der benötigten Zeit für das Include und die andere Hälft für das file_exists verbraten werden.
Das file_exists ist hier unnötig da es so oder so kracht, egal ob die datei nicht gefunden wurde oder nicht included werden kann.

Vielen Dank an alle.
Gruß KY
 
Zuletzt bearbeitet:
Zurück
Oben